改进Pygments语法突出显示Tkinter文本的速度

时间:2015-08-17 20:04:27

标签: python algorithm tkinter tcl syntax-highlighting

我正在使用pygments模块作为文本编辑器的syntax highlighting。不幸的是它非常慢,因为每次按下键时它都会从头开始突出显示。键入小程序时这种延迟并不重要,但是当打开相对较大的文件然后编辑它们时,滞后是明确的。我试图最小化这个滞后,从最后一个词开始突出显示,但我很难这样做。这是我的亮点功能。如果您想了解更多信息,我很乐意将其添加。

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)

1 个答案:

答案 0 :(得分:3)

我解决了这个问题!我检查了用户输入的行,而不是从开头到结尾,只解析了该行中的内容。这加快了语法,突出了很多。

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)