我已经尝试过搜索解决方案,但找不到有效的解决方案。我有一个2d的tkinter按钮列表,我想在鼠标点击时更改它们的文本。我试过这样做:
def create_board(number):
print(number)
for i in range (0,number):
buttonList.append([])
for j in range(0,number):
print(i,j)
buttonList[i].append(Button(root, text = " ", command = lambda: update_binary_text(i,j)))
buttonList[i][j].pack()
然后点击它时会调用此函数:
def update_binary_text(first,second):
print(first,second)
buttonList[first][second]["text"] = "1"
当我点击一个按钮时,它什么也没做,我让程序显示被点击的按钮的索引,并且它们全部显示4,4(这是变量编号= 5时)是否有解决方案这个?
这是我第一次上课的python尝试。
由于
答案 0 :(得分:10)
您可以通过创建每个lambda创建i
和j
的闭包来解决此问题:
command = lambda i=i, j=j: update_binary_text(i, j)
您还可以创建一个回调工厂,其中包含对按钮对象本身的引用:
def callback_factory(button):
return lambda: button["text"] = "1"
然后在初始化代码中:
for j in range(0, number):
new_button = Button(root, text=" ")
new_button.configure(command=callback_factory(new_button))
new_button.pack()
buttonList.append(new_button)
答案 1 :(得分:1)
每当我需要一个类似小部件的集合时,我发现最简单的方法是将它们封装在一个对象中并将一个bound-method作为回调传递,而不是使用lambda来传递技巧。因此,不要使用带有小部件的buttonList[]
列表,而是创建一个对象:
class MyButton(object):
def __init__(self, i, j):
self.i = i
self.j = j
self.button = Button(..., command = self.callback)
def callback(self):
. . .
现在,您有这些对象的列表buttonList[]
,而不是小部件本身。要更新文本,请为其提供方法,或者直接访问该成员:buttonList[i].button.configure(. . .)
当激活回调时,它具有整个对象以及self
中可能需要的任何属性。 / p>