2013-01-10 100 views
2

我有這樣的代碼在一個循環中創造了一系列的綁定:Tkinter的綁定功能

from Tkinter import * 
keys = {0:'m', 1:'n', 2:'o'} 
def SomeFunc(event=None,number=11): 
    print keys[number], number 
root = Tk() 
field = Canvas(root, height = 200, width = 200, bg = "gray") 
for i in range(2): 
    root.bind("<KeyPress-%c>" % keys[i],lambda ev:SomeFunc(ev,i)) 
field.pack() 
root.mainloop() 

我的問題是,當我按「M」或「N」功能SomeFunc變作爲一個論據來稱呼可比的'我'。當我按'm'時,我想用0作爲參數調用它(使用'bind'時的數值'i'),當我按'n'時調用1。這可以做到嗎?

回答

4

你這裏的問題是,可變i得到lambda捕獲,但你可以通過創建例如小助手功能得到解決:

for i in range(2): 
    def make_lambda(x): 
     return lambda ev:SomeFunc(ev,x) 
    root.bind("<KeyPress-%c>" % keys[i], make_lambda(i)) 

這每一個綁定創建一個新的範圍您創建,因此在循環期間執行for循環並更改i不會影響您已有的lambda函數。