2017-04-20 69 views
0

我正在嘗試使Python Tkinter程序顯示一個圓,並在按Return/Enter時將圓圈向右移動。我的代碼是:Python Tkinter:爲什麼widget.bind()不工作?

from Tkinter import * 
class GUI(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.pack() 
     self.setupStuff() 
    def setupStuff(self): 
     self.canvas = Canvas(self, height=500, width=600) 
     self.canvas.pack() 
     self.blueCircle = self.canvas.create_oval(10, 10, 40, 40, fill='dodger blue') 
     self.canvas.bind('<Return>', self.moveRight) 
    def moveRight(self): 
     print 'Yo', 
     self.canvas.move(self.blueCircle, 1, 0) 
     print 'yo' 
if __name__ == '__main__': 
    window = GUI(Tk()) 
    window.mainloop() 

我的問題是,當我按下Return/Enter時球不動。

+0

關鍵事件僅傳遞給當前具有鍵盤焦點的窗口小部件。您可以調用'.focus_set()'將焦點放在您的畫布上,但在根窗口本身而不是畫布上進行事件綁定可能更容易。 – jasonharper

回答

0

如果您希望小部件接收事件,則只需要關注的小部件可以接收事件,您需要將tkinter畫布與.focus_force()方法集中在一起。此外,當您的按鍵處理程序被調用時,它會傳遞一個包含有關事件數據的參數,因此您需要將參數添加到moveRight,否則您將得到TypeError

from Tkinter import * 
class GUI(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.pack() 
     self.setupStuff() 
     self.canvas.focus_force()  #force the canvas to take focus 

    def setupStuff(self): 
     self.canvas = Canvas(self, height=500, width=600) 
     self.canvas.pack() 
     self.blueCircle = self.canvas.create_oval(10, 10, 40, 40, fill='dodger blue') 
     self.canvas.bind('<Return>', self.moveRight) 

    def moveRight(self, eventData): #.bind passes an argument 
     self.canvas.move(self.blueCircle, 1, 0) 

if __name__ == '__main__': 
    window = GUI(Tk()) 
    window.mainloop() 
+0

這個答案的措辭是有點關閉。爲了將事件綁定到畫布,您不需要關注焦點。你只需要關注事件以後傳遞給綁定函數。 –

0

你可能你的鑰匙綁定到根是self.master你的情況,而不是將其綁定到畫布上。請參閱修改工作代碼below.As @Alex已經規定,綁定返回一個事件

from Tkinter import * 
class GUI(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master) 
     self.pack() 
     self.setupStuff() 

    def setupStuff(self): 
     self.canvas = Canvas(self, height=500, width=600) 
     self.canvas.pack() 
     self.blueCircle = self.canvas.create_oval(10, 10, 40, 40, fill='dodger blue') 
     #self.canvas.bind('<Return>',self.moveRight) 
     self.master.bind('<Return>', self.moveRight) 

    def moveRight(self, event = None): 
     print 'Yo', 
     self.canvas.move(self.blueCircle, 200, 0) 
     print 'yo' 
if __name__ == '__main__': 
    root = Tk() 
    window = GUI(root) 
    window.mainloop()