Python Tkinter:为什么widget.bind()不工作?

Python Tkinter:为什么widget.bind()不工作?,python,tkinter,keyboard-events,Python,Tkinter,Keyboard Events,我试图让Python Tkinter程序显示一个圆,并在按Return/Enter键时向右移动该圆。我的代码当前为: from Tkinter import * class GUI(Frame): def __init__(self, master=None): Frame.__init__(self, master) self.pack() self.setupStuff() def setupStuff(self):

我试图让Python Tkinter程序显示一个圆,并在按Return/Enter键时向右移动该圆。我的代码当前为:

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()
从Tkinter导入*
类GUI(框架):
def uuu init uuu(self,master=None):
帧。\uuuu初始化(自,主)
self.pack()
self.setupStuff()
def设置(自我):
self.canvas=canvas(self,高度=500,宽度=600)
self.canvas.pack()
self.blueCircle=self.canvas.create_oval(10,10,40,40,fill='dodger blue')
self.canvas.bind(“”,self.moveRight)
def右移动(自身):
打印“Yo”,
self.canvas.move(self.blueCircle,1,0)
打印“哟”
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
window=GUI(Tk())
window.mainloop()

我的问题是,当我按Return/Enter键时,球不会移动。

如果希望小部件接收事件,则需要使用
.focus\u force()
方法聚焦tkinter画布,因为只有聚焦的小部件才能接收事件。此外,当调用your keypress处理程序时,它会传递一个包含事件数据的参数,因此您需要向
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()
从Tkinter导入*
类GUI(框架):
def uuu init uuu(self,master=None):
帧。\uuuu初始化(自,主)
self.pack()
self.setupStuff()
self.canvas.focus_force()#强制画布聚焦
def设置(自我):
self.canvas=canvas(self,高度=500,宽度=600)
self.canvas.pack()
self.blueCircle=self.canvas.create_oval(10,10,40,40,fill='dodger blue')
self.canvas.bind(“”,self.moveRight)
def moveRight(self,eventData):#.bind传递一个参数
self.canvas.move(self.blueCircle,1,0)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
window=GUI(Tk())
window.mainloop()

您可以将密钥绑定到root,在您的情况下,root是
self.master
,而不是绑定到canvas。请参阅下面修改的工作代码。正如@Alex所指定的,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)
        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()
从Tkinter导入*
类GUI(框架):
def uuu init uuu(self,master=None):
帧。\uuuu初始化(自,主)
self.pack()
self.setupStuff()
def设置(自我):
self.canvas=canvas(self,高度=500,宽度=600)
self.canvas.pack()
self.blueCircle=self.canvas.create_oval(10,10,40,40,fill='dodger blue')
#self.canvas.bind(“”,self.moveRight)
self.master.bind(“”,self.moveRight)
def moveRight(自身,事件=无):
打印“Yo”,
self.canvas.move(self.blueCircle,200,0)
打印“哟”
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=Tk()
窗口=GUI(根)
window.mainloop()

按键事件仅发送到当前具有键盘焦点的小部件。您可以调用
.focus\u set()
为画布提供焦点,但在根窗口本身而不是画布上进行事件绑定可能会更容易。此答案的措辞有点不恰当。将事件绑定到画布不需要焦点。您只需要关注稍后传递给绑定函数的事件。