from tkinter import *
class App:
def __init__(self, master):
frame = Frame(master)
frame.grid()
self.grid_data_table = ["NONE"]
self.D_Text = " "
self.a = 0
self.b = 0
for i in range(1,100 + 1):
self.grid_data_table.extend([i])
self.grid_data_table[i] = Button(frame, text=self.D_Text, font="bold", command=lambda: self.selected(i))
self.a = self.a + 1
self.grid_data_table[i].grid(row=self.b, column=self.a)
#self.grid_data_table[i]["text"] = str(i) # testing only
if self.a == 10:
self.b = self.b + 1
self.a = 0
def selected(self, num):
print("Loaded Button:", num)
root = Tk()
app = App(root)
root.mainloop()
无论如何,当我运行这个时,我得到了10个10平方米的100个按钮的网格,就像我想要的那样,但问题是command = self.selected(i)似乎让所有按钮都自行完成。选择(100)和没有1,2,3,4 ... 100.我在这里做错了吗?
我想使用"列表"或"数组"这样做是因为它比编写100个按钮容易得多。
答案 0 :(得分:2)
尝试更改此行,
self.grid_data_table[i] = Button(frame, text=self.D_Text, font="bold", command=lambda: self.selected(i))
到
self.grid_data_table[i] = Button(frame, text=self.D_Text, font="bold", command=lambda i=i: self.selected(i))
问题是当前代码正在关闭变量i,因此在每个命令中它等于在函数外部设置的任何内容。在添加i=i
之前创建一个本地范围的变量i,它不会随着循环迭代的继续而改变。
答案 1 :(得分:0)
您可以执行以下操作
command=lambda i=i: self.selected(i)
您正在创建所谓的闭包,当您的命令执行时,它会在该点捕获i
的值(因此始终为100),而不是在创建按钮时。如果将i分配给另一个局部变量,则在创建Button
的位置捕获其值。