有没有办法将按键绑定到 root 而不会干扰 tkinter 中的默认绑定

问题描述

我正在尝试向 tkinter 中的文本小部件添加语法突出显示 我正在使用另一个堆栈溢出问题 Pygments syntax highlighter in python tkinter text widget 中的代码 我将语法高亮的函数绑定到根 但问题是所有其他认绑定,如 CTRL A 停止工作。 如果我将它绑定到文本小部件但最后一个 输入的字母没有突出显示。 这是代码(我是编程新手,所以可能会有很多愚蠢的错误

from tkinter import *
from pygments import lex
from pygments.lexers import PythonLexer

def test(e):
    txt.mark_set("range_start","1.0")
    data = txt.get("1.0","end")
    for tag in txt.tag_names():
        txt.tag_remove(tag,"1.0","end")
    for token,content in lex(data,PythonLexer()):
        txt.mark_set("range_end","range_start + %dc" % len(content))
        txt.tag_add(str(token),"range_start","range_end")
        txt.mark_set("range_start","range_end")

root=Tk()
txt=Text(root)
txt.pack(expand='yes')
txt.tag_configure("Token.Comment.Single",foreground='red')
root.bind('<Any-KeyPress>',test)
root.mainloop()

解决方法

问题不是因为您要替换默认绑定。这根本不是绑定在 tkinter 中的工作方式。没有直接绑定到根小部件或任何其他特定小部件的绑定。默认绑定实现为“所有”或小部件类上的绑定,而不是单个小部件。

如果我将它绑定到文本小部件,它们工作正常,但最后输入的字母没有突出显示。

那是因为小部件上的绑定发生在默认绑定之前。因此,如果您输入“a”,您的代码将在插入字母“a”的代码之前被调用。

此站点上有一个与处理事件的顺序有关的问题。虽然答案与 Entry 小部件相关,但完全相同的概念适用于所有小部件。请参阅问题 this answer

Basic query regarding bindtags in tkinter