2013-04-25 96 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