【问题标题】:Python Tkinter: Why is widget.bind() not working? [duplicate]Python Tkinter:为什么 widget.bind() 不起作用? [复制]
【发布时间】:2017-04-20 04:03:24
【问题描述】:

我正在尝试让 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()

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

【问题讨论】:

  • 按键事件仅传递给当前具有键盘焦点的小部件。您可以调用 .focus_set() 将焦点放在画布上,但在根窗口本身而不是画布上进行事件绑定可能会更容易。

标签: python tkinter keyboard-events


【解决方案1】:

您可以将您的密钥绑定到根目录,在您的情况下为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()

【讨论】:

    【解决方案2】:

    如果您希望小部件接收事件,则需要使用 .focus_force() 方法聚焦 tkinter 画布,因为只有聚焦的小部件才能接收事件。此外,当您的按键处理程序被调用时,它会传递一个包含事件数据的参数,因此您需要向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()
    

    【讨论】:

    • 这个答案的措辞有点不对劲。您不需要焦点即可将事件绑定到画布。您只需要关注稍后传递给绑定函数的事件即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2018-06-04
    • 2021-04-06
    • 2013-02-03
    • 2013-04-04
    相关资源
    最近更新 更多