2017-04-20 68 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()