我有一個簡單的 for 回圈,可以在視窗中創建兩行三個按鈕
for c in range(3):
for r in range(2):
tk.Button(width=10, height=2).grid(column=c, row=r, pady=6, padx=2)
我一直在嘗試使用從 pandas 資料框中的每一行獲取的文本來標記每個單獨的按鈕,如下所示
import tkinter as tk
import pandas as pd
window = tk.Tk()
window.geometry('255x200')
data = {'name': ['Name1', 'Name2', 'Name3', 'Name4', 'Name5', 'Name6'],
'Value': ['Value1', 'Value2', 'Value3', 'Value4', 'Value5', 'Value6']}
df = pd.DataFrame(data)
index = df.index
rows = len(index)
namelist = df.iloc[1:rows,0]
for c in range(3):
for r in range(2):
for t in namelist:
tk.Button(width=10, height=2, text=t).grid(column=c, row=r, pady=6, padx=2)
window.mainloop()
這導致的問題是每個按鈕都標有“名稱”列中的最新條目。有沒有辦法使用這個 for 回圈正確標記這些按鈕?
uj5u.com熱心網友回復:
輕松的任務。您可以使用變數來非常復雜地為您的按鈕分配一個變數,或者像這樣:
import tkinter as tk
import pandas as pd
window = tk.Tk()
window.geometry('255x200')
data = {'name': ['Name1', 'Name2', 'Name3', 'Name4', 'Name5', 'Name6'],
'Value': ['Value1', 'Value2', 'Value3', 'Value4', 'Value5', 'Value6']}
df = pd.DataFrame(data)
index = df.index
rows = len(index)
namelist = df.iloc[0:rows,0]
for r in range(2):
for c in range(3):
idx_namelist = (((r 1)*(r 1) c)-1)
tk.Button(width=10, height=2, text=namelist.iloc[idx_namelist]).grid(column=c, row=r, pady=6, padx=2)
window.mainloop()
您的代碼在這里有錯誤。它應該從 0 開始:
名單 = df.iloc[1:rows,0]
而且你的按鈕總是得到回圈最后一個值的名稱,因為text=從未改變過。
我更改了 c 和 r 并使用它們來計算按鈕的編號,并使用此索引來獲取按鈕的名稱。
idx_namelist = (((r 1)*(r 1) c)-1)成功了。
uj5u.com熱心網友回復:
問題在于您的回圈方法。您正在回圈遍歷行號和列號,然后遍歷串列中的每個名稱。基本上發生的事情是針對每一行和每一列,然后您遍歷名稱串列中的每個名稱。這意味著您正在創建 36 個按鈕而不是 6 個。
讓我們看看r=0和c=0。r=0然后,您c=0將遍歷 namelist 中的所有名稱。首先,在網格中(0,0)放置按鈕Name1。但是,然后您將另一個按鈕放置在網格(0,0)中,其標簽與其Name2重疊,因此您只能看到Name2. 這一直持續到您到達Name6. 這就是為什么您只能Name6在每個位置看到。
另外,不要忘記從 0 開始索引namelist = df.iloc[0:rows,0]。或者,您可以設定namelist=df['name'],然后您不需要計算行數。
一種解決方案是僅回圈遍歷名稱串列,并在回圈內為您手動遞增的行和列使用單獨的計數器。
試試這個。我編輯了回圈,所以你只回圈每個名稱一次。
import tkinter as tk
import pandas as pd
window = tk.Tk()
window.geometry('255x200')
data = {'name': ['Name1', 'Name2', 'Name3', 'Name4', 'Name5', 'Name6'],
'Value': ['Value1', 'Value2', 'Value3', 'Value4', 'Value5', 'Value6']}
df = pd.DataFrame(data)
index = df.index
rows = len(index)
namelist = df.iloc[0:rows,0]
c = 0
r = 0
for t in namelist:
tk.Button(width=10, height=2, text=t).grid(column=c, row=r, pady=6, padx=2)
c = c 1
if c > 2:
c = 0
r = r 1
window.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/419068.html
標籤:
