2014-12-02 78 views
-1

我不是有經驗的程序員,我無法找到解決這個問題的方法。 我想用他們的按鈕描述創建一個長的子程序列表,並使用下面的代碼來創建按鈕。但是這樣的代碼總是將最後一個子程序從列表中分配給所有按鈕。Tkinter按鈕命令循環執行總是最後一個命令

self.row=Frame(root) 
self.programs=(('description1',p1),('description2',p2)) 
for self.program in self.programs: 
    self.b= Button(self.row, text=self.program[0], command=lambda event="":self.program[1]()) 
    self.row.pack(side=TOP, fill=X, padx=5, pady=5) 
    self.b.pack(side=LEFT, padx=5, pady=5) 

它運行良好,除了所有按鈕都在執行p2。如何解決這個問題?

謝謝。

回答

0

這是因爲後期綁定,self.program決定何時調用回調,而不是創建時。

使用默認參數,以避免該問題:

self.row=Frame(root) 
self.programs=(('description1',p1),('description2',p2)) 
for naem, callback in self.programs: 
    self.b = Button(self.row, text=self.program[0], 
        command=lambda callback=callback: callback()) # <--- 
    self.row.pack(side=TOP, fill=X, padx=5, pady=5) 
    self.b.pack(side=LEFT, padx=5, pady=5) 

BTW,使用command回調集不調用的參數。

+0

你真棒! – 2014-12-02 11:24:21

+0

@KetiwSimplistik,歡迎來到堆棧溢出!如果這對你有幫助,你可以通過[接受答案](http://meta.stackoverflow.com/a/5235)告訴社區。 – falsetru 2014-12-02 11:24:44