我试着寻找解决办法,但找不到有效的办法。我有一个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类。
谢谢
每当我需要一个类似的小部件集合时,我发现将它们封装在一个对象中并将绑定方法作为回调传递比使用lambda更简单。因此,创建一个对象,而不是使用带有小部件的
buttonList[]
这样的列表:现在,您有这些对象的列表,而不是小部件本身。若要更新文本,请为此提供一个方法,或者直接访问成员:
buttonList[i].button.configure(. . .)
,并且当回调被激活时,它具有整个对象以及在self
中可能需要的任何属性。每当我需要一组类似的小部件时,我发现将它们封装在一个对象中并将绑定方法作为回调传递比使用lambda更简单。因此,创建一个对象,而不是使用带有小部件的
buttonList[]
这样的列表:现在,您有这些对象的列表,而不是小部件本身。若要更新文本,请为此提供一个方法,或者直接访问成员:
buttonList[i].button.configure(. . .)
,并且当回调被激活时,它具有整个对象以及在self
中可能需要的任何属性。可以通过创建每个lambda为
i
和j
创建一个闭包来解决此问题:还可以创建一个回调工厂,其中引用按钮对象本身:
然后在初始化代码中:
相关问题 更多 >
编程相关推荐