Python Tkinter:为什么widget.bind()不工作?
我试图让Python Tkinter程序显示一个圆,并在按Return/Enter键时向右移动该圆。我的代码当前为: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):
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()
为画布提供焦点,但在根窗口本身而不是画布上进行事件绑定可能会更容易。此答案的措辞有点不恰当。将事件绑定到画布不需要焦点。您只需要关注稍后传递给绑定函数的事件。