Python 提高Tkinter文本的Pygments语法高亮显示速度

Python 提高Tkinter文本的Pygments语法高亮显示速度,python,algorithm,tkinter,tcl,syntax-highlighting,Python,Algorithm,Tkinter,Tcl,Syntax Highlighting,我正在使用pygments模块进行文本编辑器的语法突出显示。不幸的是,它非常慢,因为每次按下一个键,它都会从一开始就高亮显示。当键入小程序时,这种延迟并不明显,但当打开相对较大的文件并编辑它们时,这种延迟是明显的。我正试图从最后一个单词开始突出显示,以尽量减少这种延迟,但我很难做到这一点。这是我的突出显示功能。如果你想要更多的信息,我很乐意补充 def highlight(self, argument): self.content = self.text.get("0.0", tk.EN

我正在使用
pygments
模块进行文本编辑器的
语法突出显示
。不幸的是,它非常慢,因为每次按下一个键,它都会从一开始就高亮显示。当键入小程序时,这种延迟并不明显,但当打开相对较大的文件并编辑它们时,这种延迟是明显的。我正试图从最后一个单词开始突出显示,以尽量减少这种延迟,但我很难做到这一点。这是我的突出显示功能。如果你想要更多的信息,我很乐意补充

def highlight(self, argument):
    self.content = self.text.get("0.0", tk.END)

    if (self.previousContent != self.content):
        self.text.mark_set("range_start", "0.0")

        self.words = self.content.split(" ")
        self.lastWordLength = len(self.words[len(self.words) - 1])

        self.lastPos = self.text.index("end-1c")
        self.startRow = int(self.lastPos.split(".")[0])
        self.startCol = abs(int(self.lastPos.split(".")[1]) - self.lastWordLength)

        print(self.startRow, self.startCol) # Results in incorrect values

        data = self.text.get("0.0", tk.END)
        for token, content in lex(data, PythonLexer()):
            self.text.tag_configure("Token.Keyword", foreground="#CC7A00")
            self.text.tag_configure("Token.Keyword.Constant", foreground="#CC7A00")
            self.text.tag_configure("Token.Keyword.Declaration", foreground="#CC7A00")
            self.text.tag_configure("Token.Keyword.Namespace", foreground="#CC7A00")
            self.text.tag_configure("Token.Keyword.Pseudo", foreground="#CC7A00")
            self.text.tag_configure("Token.Keyword.Reserved", foreground="#CC7A00")
            self.text.tag_configure("Token.Keyword.Type", foreground="#CC7A00")

            self.text.tag_configure("Token.Name.Class", foreground="#003D99")
            self.text.tag_configure("Token.Name.Exception", foreground="#003D99")
            self.text.tag_configure("Token.Name.Function", foreground="#003D99")

            self.text.tag_configure("Token.Operator.Word", foreground="#CC7A00")

            self.text.tag_configure("Token.Comment", foreground="#B80000")

            self.text.tag_configure("Token.Literal.String", foreground="#248F24")

            self.text.mark_set("range_end", "range_start + %dc" % len(content))
            self.text.tag_add(str(token), "range_start", "range_end")
            self.text.mark_set("range_start", "range_end")

    self.previousContent = self.text.get("0.0", tk.END)

我解决了这个问题!我没有从头到尾检查用户键入的行,而是只分析该行中的内容。这大大加快了语法高亮显示的速度

def deafultHighlight(self, argument):
    self.content = self.text.get("1.0", tk.END)
    self.lines = self.content.split("\n")

    if (self.previousContent != self.content):
        self.text.mark_set("range_start", self.row + ".0")
        data = self.text.get(self.row + ".0", self.row + "." + str(len(self.lines[int(self.row) - 1])))

        for token, content in lex(data, PythonLexer()):
            self.text.mark_set("range_end", "range_start + %dc" % len(content))
            self.text.tag_add(str(token), "range_start", "range_end")
            self.text.mark_set("range_start", "range_end")

    self.previousContent = self.text.get("1.0", tk.END)

听起来你是在要求我们想出一个高效高亮显示的算法。这不是stackoverflow的目的。“更有效率”太宽泛了。不过,这里有一个简短的提示可能会有一点帮助:您只需要调用
tag\u configure
一次,而不是为每个令牌调用一次。您只需要调用
tag\u add
,即可使用每个令牌。您在几个地方使用索引
“0.0”
。这不会影响性能,但第一个字符是
“1.0”
,而不是
“0.0”
@BryanOakley我必须说,非常感谢这一技巧,它大大改善了延迟。但我仍然不知道如何解决这个问题。@BryanOakley我正试图用上面的代码从最后一个单词开始,但当我按enter键时,我都搞砸了。谢谢分享,这真的非常有用!这是可行的,但是有人找到了在删除角色后删除标记的方法吗?假设您键入“class”,pygments将其作为关键字突出显示,然后删除一个字符,剩下的是突出显示的“clas”。请发布一个回复。我刚刚找到了一个修复我的问题的方法,它可能不是最干净的,但是在再次应用pygments之前,请删除pygments中应用的每个标记。