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
行。将它们移动到一个单独的函数并在解决问题后调用它。
我正在尝试在我制作的文本编辑器中进行语法高亮显示,它现在使用 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
行。将它们移动到一个单独的函数并在解决问题后调用它。