为什么是小工具.绑定()不工作?

2024-10-01 17:22:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图让pythonttkinter程序显示一个圆,并在按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()

我的问题是,当我按下Return/Enter时,球没有移动。在


Tags: selfmasterreturninitdefguiwindowframe
2条回答

如果希望小部件接收事件,则需要使用.focus_force()方法来聚焦tkinter画布,因为只有聚焦的小部件才能接收事件。另外,当您的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()

您可以将键绑定到根目录,在您的例子中是self.master,而不是将其绑定到画布。请参阅修改后的工作代码下面。作为@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()

相关问题 更多 >

    热门问题