Skip to content Skip to sidebar Skip to footer

How Do I Recognize Key On Numpad Is Being Clicked?

I use bind() to set actions for keys, but when I want to add action to number keys on Numpad it doesn't work. How should the code look if I want it to work?

Solution 1:

It actually depends on the state of the NumLock key.

To identify which key has been pressed, the tkinter event object has three attributes: char, keysym and keycode.

Focussing on the keypad numbers, with NumLock ON these are (0-9):

char    keysym      keycode
'0''0'96'1''1'97'2''2'98'3''3'99'4''4'100'5''5'101'6''6'102'7''7'103'8''8'104'9''9'105

With NumLock OFF these are (0-9):

char    keysym      keycode
'''Insert'45'''End'35'''Down'40'''Next'34'''Left'37'''Clear'12'''Right'39'''Home'36'''Up'38'''Prior'33

Now, for the numbers (so NumLock ON), the char and keysym are the same, but keycode is different for the numpad numbers and the normal row above the letters. For example, the 2 in the number row has keycode50, while the 2 in the numpad has keycode98.

However, with NumLock OFF, the keys are indistinguishable from the other keys with the same meaning. For example, both the normal End and the one under the 1 in the keypad have keycode35.

So to check for the 1 key on the numpad regardless of the state of NumLock, you need to check for the keycode being either 97 or 35. However, this does mean that pressing the regular End key will have the same effect and I don't know of any way to stop this.


I used the following code to check all values posted above:

import tkinter as tk

root = tk.Tk()

defkey(event):
    print(repr(event.char), repr(event.keysym), repr(event.keycode))

root.bind("<Key>", key)
root.mainloop()

Post a Comment for "How Do I Recognize Key On Numpad Is Being Clicked?"