2013-04-25 97 views
6

我尝试搜索解决方案,但找不到可用的解决方案。我有一个tkinter按钮的二维列表,我想在用鼠标点击时更改它们的文本。当点击它然后在Python中使用lambda的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。

感谢

回答

8

您可以通过创建每个拉姆达的创造ij封闭解决这个问题:

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) 
+0

哇!你的解决方案工作谢谢你,先生!现在我坚持你发布的第一个例子。但我肯定会研究你展示的第二个例子。再次感谢! – vap 2013-04-26 02:20:36

0

每当我需要类似小部件的集合时,我觉得把它们放在一个对象中并将一个绑定方法作为回调传递,而不是用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