我正在编写一个编辑器(使用 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/