我試圖在tkinter中添加語法高亮顯示到文本小部件,我使用的代碼來自另一個堆棧溢出問題Pygments syntax highlighter inpythontkinter文本小部件我將syntax 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”的代碼之前被調用。
這個網站上有一個關于事件處理順序的問題。雖然答案與條目小部件有關,但完全相同的概念適用于所有小部件。在tkinter中查看這個關于bindtag的基本查詢問題的答案