tkinter pygment 突出显示使用 pygments 非常慢,即使 运行 一次

tkinter pygment highlighting very slow using pygments even when running once

我正在尝试在我制作的文本编辑器中进行语法高亮显示,它现在使用 Pygments 和显然是 tkinter 突出显示 [一些不正确的事情,但现在不重要]。问题是,当我 运行 它时,即使只有一次,它也非常慢,我的笔记本电脑很便宜,所以这显然是一个因素,但是 vim、IDLE 等 运行 只是很好。

我读过一些关于突出显示速度慢的 SO 帖子,但这些只是关于何时更新它,而不是更新,例如,在每个单词之后。我的问题是 一次 次 运行 语法高亮,它滞后了。

这里先是高亮代码:

def highlight(t):

    t.mark_set("range_start", "1.0")
    data = t.get("1.0", "end-1c")

    for token, content in lex(data, PythonLexer()):
        t.mark_set("range_end", "range_start + %dc" % len(content))
        t.tag_add(str(token), "range_start", "range_end")
        t.tag_configure("Token.Keyword", foreground="#CC7A00")
        t.tag_configure("Token.Keyword.Constant", foreground="#CC7A00")
        t.tag_configure("Token.Keyword.Declaration", foreground="#CC7A00")
        t.tag_configure("Token.Keyword.Namespace", foreground="#CC7A00")
        t.tag_configure("Token.Keyword.Pseudo", foreground="#CC7A00")
        t.tag_configure("Token.Keyword.Reserved", foreground="#CC7A00")
        t.tag_configure("Token.Keyword.Type", foreground="#CC7A00")

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

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

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

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

    t.mark_set("range_start", "range_end")

现在,我 运行 它只是通过在我的主文件中调用 highlight(text),所以除非有要求,否则没有必要从那里提供代码。

只有 运行 当我打开文件或使用 GUI 切换文件时[就像具有多文件支持的普通编辑器一样]。文件越大,运行 突出显示 [有效地短时间停止程序。]

所需的时间越长

有没有办法让它更快,或者我因为 Python 和 Pygments 而受到限制? [我假设不是,因为 IDLE 不是!]

谢谢!如果您想要更多代码 [我不明白为什么],可以提供。

编辑:无法正常工作的突出显示 [我唯一注意到的] 是在我调用函数时 [定义函数突出显示名称,如 def printStuff():,但 printStuff()不是。还有评论,例如 [显然] #hi"""hi""",以防万一有人可以提供帮助。

Edit2:其他有用的信息:它最初 运行 不断,但当时很慢,所以我决定只在文件打开或切换时 运行,认为它会是如果我这样做至少很快,但现在打开文件或切换文件需要几秒钟......所以问题似乎出在高亮功能本身。

Bryan Oakley 在评论中提供了答案,每次我更新语法突出显示时都会调用 tag_configure 行。将它们移动到一个单独的函数并在解决问题后调用它。