【问题标题】:Improve Pygments Syntax Highlighting Speed for Tkinter Text提高 Tkinter 文本的 Pygments 语法突出显示速度
【发布时间】:2015-08-17 20:04:26
【问题描述】:

我正在为我的文本编辑器的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)

【问题讨论】:

  • 听起来您是在要求我们提出一种高效突出显示的算法。这不是stackoverflow的用途。 “更有效”太宽泛了。不过,这里有一个可能会有所帮助的快速提示:您只需要调用一次tag_configure,而不是每个令牌一次。你需要对每个令牌做的唯一想法是调用tag_add
  • 您在几个地方使用了索引"0.0"。这不会影响性能,但第一个字符是 "1.0" 而不是 "0.0"
  • @BryanOakley 我不得不说,非常感谢您的提示,它大大改善了延迟。但是我仍然不知道如何解决这个问题。
  • @BryanOakley 我正在尝试使用上面的代码从最后一个单词开始,但是当我按下回车键时我都搞砸了。

标签: python algorithm tkinter tcl syntax-highlighting


【解决方案1】:

我解决了这个问题!我没有从头到尾检查,而是检查了用户输入的行,并且只解析了该行中的内容。这加快了突出显示 LOT 的语法。

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)

【讨论】:

  • 感谢分享,这真的非常有用!
  • 这行得通,但是有没有人找到删除字符后删除标签的方法?假设您输入“class”并且 pygments 将其突出显示为关键字,然后您删除一个字符并留下突出显示的“clas”。请回复
  • 刚刚找到了解决我的问题的方法,它可能不是最干净的,但只需删除从 pygments 应用的每个标签,然后再次应用它们。
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 2019-03-06
  • 2013-12-19
  • 2013-08-07
相关资源
最近更新 更多