Tkinter – Can't bind arrow key events

Question:

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:

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.pack()
frame.mainloop()

Why is this not working?

Asked By: aftrumpet

||

Answers:

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()
Answered By: Fiver

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()
Answered By: Bryan Oakley
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()
Answered By: mc diamond 144

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 🙂

Answered By: Claude
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.