python - 为什么 tkinter 键事件 <Tab> 的优先级高于 tkinter 键事件 <key>?

标签 python tkinter event-handling

我正在编写一个编辑器(使用 tkinter 文本小部件),它将制表符(由用户插入)动态替换为 4 个空格。 替换是通过绑定(bind)制表键事件(“Tab”)来完成的,它插入 4 个空格并以“break”返回。使用“break”返回可防止插入制表符字符。这很好用。 此外,我需要对任何按键事件进行第二次绑定(bind)(“Key”,用于语法突出显示和类似的东西)。所以我实现了与“Key”的第二个绑定(bind)。这也很好用。

据我发现,<Tab> 的绑定(bind)具有更高的优先级,因为 <key> 的绑定(bind): 每当按下 Tab 键时,只有 Tab 事件会被激活,但按键事件不会被激活。

这是为什么呢? 是否为事件定义了优先顺序?

这是我的示例代码:

import tkinter as tk

def key_event():
    print("Key")

def tab_event(text):
    print("Tab")
    text.insert("insert", "    ")
    return("break")

root = tk.Tk()

text = tk.Text(root, height=8, width=20)
text.grid()
text.bind("<Tab>", lambda event : tab_event(text))
text.bind("<Key>", lambda event : key_event())

root.mainloop()

最佳答案

根据documentation ,选择更具特异性的结合。解决此问题的一个简单但有效的方法是使用广泛的绑定(bind),例如 '<Key>'并通过它的键符号相应地委托(delegate)事件,您可以通过 event.keysym 访问该事件.

例如:

import tkinter as tk

def key_event(event):
    if event.keysym == 'Tab':
        text.insert("insert", " "*4)
        return 'break'

root = tk.Tk()
text = tk.Text(root, height=8, width=20)
text.grid()
text.bind("<Key>", key_event)

root.mainloop()

关于python - 为什么 tkinter 键事件 <Tab> 的优先级高于 tkinter 键事件 <key>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74405202/

相关文章:

python - 我需要想办法在触摸屏上获取用户签名

javascript - 多次调用编码的 COM 接口(interface)

python - 寻路Python算法回溯

python生成xml

python - 即使在 Pandas 中使用 .loc 后也会收到 SettingWithCopyWarning 警告

python - 类型错误:button_click() 缺少 1 个必需的位置参数: 'self'

python - 网格几何管理器不会将框架置于窗口中间

qt - PyQt 事件处理和 QErrorMessage : detect the source of the click

C#在计时器停止后停止事件处理程序

python多态性概念示例