2013-05-26 54 views
1

我想從列表形式存儲的一組數據中動態地構建tkinter中的一些按鈕。我無法解決的是如何在回調函數中添加一個參數。由於回調代碼直到回調時才執行,因此回調中使用的變量已在此時更改了值。動態設置python中的參數回調

這裏有一個代碼(非常)的簡化版本:

from Tkinter import * 
from ttk import * 

mylist = ['a','b','c','d','e'] 


class App: 

    def __init__(self, master): 

     self.frame = Frame(master) 
     self.frame.pack() 

     for i in range (0,len(mylist)): 
      setattr(self, 'button' + str(i), Button(self.frame, text=mylist[i], command= lambda: self.buttoncall(i))) 
      getattr(self, 'button' + str(i)).pack(side=LEFT) 

    def buttoncall(self,input): 
     print mylist[input] 

root = Tk() 

app = App(root) 

root.mainloop() 
+0

相關:[爲什麼地圖()和列表理解的結果是不同的?](http://stackoverflow.com/q/139819/4279) – jfs

回答

5

設置i默認值:

command=lambda i=i: self.buttoncall(i) 

當回調被稱爲不帶參數的默認值i將被綁定到局部變量i。由於在定義lambda時默認值是固定的,因此i的值將是所需的值。

沒有i的默認值,當調用回調時i不是局部變量。 Python會在封閉範圍內找到i的值。但是,在回調被調用時,for-loop已完成,i等於len(mylist)-1。所以所有的回調都使用相同的值i

+0

非常感謝unutbu – user1379351