我有一个简单的用户界面,它应该打印我按下的每个键。
我需要在每次真正按键时生成信号一次。
我怎样才能做到这一点?
默认情况下,tkinter 生成信号一次,然后等待大约 0.5 秒并开始循环生成信号,直到 KeyRelease 事件发生。
if __name__ == '__main__':
from tkinter import Tk, Frame
root = Tk()
frame = Frame(root, width=200, height=200, bg="white")
frame.pack()
def key_handler(event):
print(event.char, event.keysym, event.keycode)
return 'break'
root.bind('<Key>', key_handler)
root.mainloop()
在绑定函数末尾使用“break”不会停止下一个事件调用。
此外(因为这是一个小问题,对于单独的帖子来说太小),我如何创建这些按键序列?:
UPD: 我真的不想这样做:
def key_handler(event):
global eve
if eve != event.keysym:
eve = event.keysym
print(event.char, event.keysym, event.keycode)
因为当我想完全删除它时信号仍在处理。但是,我真的不知道虚拟信号对程序总共有多大影响,所以这个解决方案可能有意义吗?
您可以跟踪按下的内容并忽略同时按下的按键(从按住的键开始)。
root = tk.Tk()
frame = tk.Frame(root, width=200, height=200, bg="white")
frame.pack()
keys = []
def key_handler(event):
if event.type is tke.KeyPress:
if not (event.keycode in keys):
keys.append(event.keycode)
print('do single press stuff here')
elif event.type is tke.KeyRelease:
if event.keycode in keys:
keys.remove(event.keycode)
root.bind('<KeyPress>', key_handler)
root.bind('<KeyRelease>', key_handler)
root.mainloop()
for i in range(0, 10):
root.bind(f'<Shift-{i}>', key_handler)
您必须跟踪是否按住了数字,然后轮询 + 或 -。可以修改我的第一个示例来处理这个问题。