提高 Tkinter 文本的 Pygments 语法突出显示速度

Improve Pygments Syntax Highlighting Speed for Tkinter Text

我正在为文本编辑器 syntax highlighting 使用 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)