【发布时间】:2018-09-06 07:35:01
【问题描述】:
我使用bind() 为按键设置操作,但是当我想为数字键盘上的数字键添加操作时,它不起作用。如果我想让它工作,代码应该是什么样子?
【问题讨论】:
我使用bind() 为按键设置操作,但是当我想为数字键盘上的数字键添加操作时,它不起作用。如果我想让它工作,代码应该是什么样子?
【问题讨论】:
这实际上取决于 NumLock 键的状态。
为了识别哪个键被按下,tkinter event 对象具有三个属性:char、keysym 和 keycode。
专注于键盘数字,NumLock ON 这些是(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
在 NumLock 关闭的情况下,这些是 (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
现在,对于数字(所以 NumLock ON),char 和 keysym 是相同的,但 keycode 对于小键盘数字和字母上方的普通行是不同的.例如,数字行中的2为keycode50,而小键盘中的2为keycode98。
但是,在 NumLock 关闭的情况下,这些键与具有相同含义的其他键无法区分。例如,普通的End和键盘中1下面的都有keycode35。
因此,无论 NumLock 的状态如何,要检查数字键盘上的 1 键,您需要检查 keycode 是否为 97 或 @ 987654338@。但是,这确实意味着按常规 End 键将产生相同的效果,我不知道有什么方法可以阻止它。
我使用以下代码检查上面发布的所有值:
import tkinter as tk
root = tk.Tk()
def key(event):
print(repr(event.char), repr(event.keysym), repr(event.keycode))
root.bind("<Key>", key)
root.mainloop()
【讨论】: