有没有一种方法可以在不干扰tkinter中默认绑定的情况下将按键绑定到root



我正在尝试为tkinter中的文本小部件添加语法高亮显示我使用的是另一个堆栈溢出问题中的代码python tkinter文本小部件中的Pygments语法高亮显示我将语法hyghlighting的函数绑定到根但问题是,所有其他默认绑定(如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小部件有关,但完全相同的概念适用于所有小部件。请参阅以下问题的答案关于tkinter 中绑定标签的基本查询

最新更新