如何使用 tkinter.bind 方法生成单个按键事件信号

问题描述 投票:0回答:1

我有一个简单的用户界面,它应该打印我按下的每个键。
我需要在每次真正按键时生成信号一次
我怎样才能做到这一点?
默认情况下,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”不会停止下一个事件调用。

此外(因为这是一个小问题,对于单独的帖子来说太小),我如何创建这些按键序列?:

  • “Shift”和一些数字
  • 一些数字和“+”或“-”符号

UPD: 我真的不想这样做:

def key_handler(event):
    global eve
    if eve != event.keysym:
        eve = event.keysym
        print(event.char, event.keysym, event.keycode)

因为当我想完全删除它时信号仍在处理。但是,我真的不知道虚拟信号对程序总共有多大影响,所以这个解决方案可能有意义吗?

python python-3.x user-interface tkinter signals
1个回答
0
投票

您可以跟踪按下的内容并忽略同时按下的按键(从按住的键开始)。

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)
一些数字和+或-

您必须跟踪是否按住了数字,然后轮询 + 或 -。可以修改我的第一个示例来处理这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.