Tkinter - Can't bind arrow key events

前端 未结 4 1696
梦谈多话
梦谈多话 2020-12-14 17:18

I am trying to bind the left and right arrow keys to an event in Tkinter, but when I run the program it appears the events are not triggering. Here is the code:



        
相关标签:
4条回答
  • The problem is simply that the frame you are binding to doesn't have the keyboard focus. When you press a key on the keyboard, the event is sent to the widget with the keyboard focus. By default, a frame does not have keyboard focus.

    Add the following line to your code to move the keyboard focus to the frame:

    frame.focus_set()
    
    0 讨论(0)
  • 2020-12-14 17:49

    Try binding to your main variable:

    from Tkinter import *
    
    main = Tk()
    
    def leftKey(event):
        print "Left key pressed"
    
    def rightKey(event):
        print "Right key pressed"
    
    frame = Frame(main, width=100, height=100)
    main.bind('<Left>', leftKey)
    main.bind('<Right>', rightKey)
    frame.pack()
    main.mainloop()
    

    I should explain that this works because Tk is made aware of the bindings because the main window has keyboard focus. As @BryanOakley's answer explained you could also just set the keyboard focus to the other frame:

    from Tkinter import *
    
    main = Tk()
    
    def leftKey(event):
        print "Left key pressed"
    
    def rightKey(event):
        print "Right key pressed"
    
    frame = Frame(main, width=100, height=100)
    frame.bind('<Left>', leftKey)
    frame.bind('<Right>', rightKey)
    frame.focus_set()
    frame.pack()
    main.mainloop()
    

    See more about events and bindings at effbot.

    Also, you could also re-write this so your application is a sub-class of Tkinter.Frame like so:

    import Tkinter
    
    
    class Application(Tkinter.Frame):
        def __init__(self, master):
            Tkinter.Frame.__init__(self, master)
            self.master.minsize(width=100, height=100)
            self.master.config()
    
            self.master.bind('<Left>', self.left_key)
            self.master.bind('<Right>', self.right_key)
    
            self.main_frame = Tkinter.Frame()
            self.main_frame.pack(fill='both', expand=True)
            self.pack()
    
        @staticmethod
        def left_key(event):
            print event + " key pressed"
    
        @staticmethod
        def right_key(event):
            print event + " key pressed"
    
    root = Tkinter.Tk()
    app = Application(root)
    app.mainloop()
    
    0 讨论(0)
  • 2020-12-14 17:57

    It might be that you don't intercept the right events. The arrows on the numeric keypad and the other ones have different symbolic names.

    See http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/key-names.html

    the ones on the numeric keypad are named with a 'KP_' in front.

    Hope it helps. Pardon a newbie if not pertinent :-)

    0 讨论(0)
  • 2020-12-14 18:01
    from tkinter import *
    
    
    def leftKey(event):
        print("Left key pressed")
    
    
    def rightKey(event):
        print("Right key pressed")
    
    
    main = Tk()
    
    
    frame = Frame(main, width=100, height=100)
    main.bind('<Left>', leftKey)
    main.bind('<Right>', rightKey)
    frame.pack()
    main.mainloop()
    
    0 讨论(0)
提交回复
热议问题