2014-06-12 116 views
1

我做了一個工作一段代碼,用於支持在畫布上的對象的關鍵控制運動:Tkinter的循環鍵綁定不工作

self.can = tk.Canvas(master, width=100, height=100) 
self.can.grid() 

self.can.bind('<Right>', lambda event: self.move(0)) 
self.can.bind('<Down>', lambda event: self.move(90)) 
self.can.bind('<Left>', lambda event: self.move(180)) 
self.can.bind('<Up>', lambda event: self.move(270)) 

self.can.focus_set() 

def move(self, dir): 
    if dir == 0: 
     print 'right' 
    elif dir == 90: 
     print 'down' 
    elif dir == 180: 
     print 'left' 
    elif dir == 270: 
     print 'up' 

我沒有對象,所以我只是測試關鍵綁定。沒關係。但後來我試圖優化的東西,並把這些綁定在一個循環中

x = 0 
for i in ['<Right>', '<Down>', '<Left>', '<Up>']: 
    self.can.bind(i, lambda event: self.move(x)) 
    x += 90 

...它停止工作。沒有錯誤,但沒有約束力。也許這都是關於.bind()函數的event參數 - 我認爲這是一個常見的string,但在網絡中找不到這個或相反的證據。如果我確信視覺上類似的綁定數量會持續增長,並且我不希望在我的代碼中有任何複製粘貼,我該如何保持事情的好和短?

更新:發現綁定不應被視爲代碼的功能部分,因此不需要審美縮短。但我仍然很好奇,爲什麼沒有這個工作,以及什麼event論點組成。

+0

爲什麼把它們放在一個循環?結果不太清晰,容易出現常見錯誤(例如您正在遇到的錯誤),並使用相同數量的代碼行。通過循環做這件事,你什麼也得不到。 –

回答

0

這是因爲對於所有綁定,x將等於360.Lambda將在執行時獲取當前x值。當它發生X = 360

這速戰速決,要解決這個問題:

self.can.bind(i, lambda event, xx=x: self.move(xx)) 
+0

謝謝,這可能對我有用。但布萊恩的權利,縮短這一點並不是必要的。 –