【发布时间】:2023-03-09 16:55:01
【问题描述】:
我正在尝试在我正在制作的文本编辑器中使用语法突出显示,现在它正在使用 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() 不是。还有 cmets,例如 [显然] #hi 或 """hi""",以防万一任何人也可以提供帮助。
Edit2:其他有用的信息:它最初一直在运行,但当时非常慢,所以我决定只在文件打开或切换时让它运行,我认为如果我这样做至少会很快,但它现在需要几秒钟来打开文件或切换文件...所以问题似乎出在高亮功能本身。
【问题讨论】:
-
代码的固定格式
-
格式还是不对。请提供minimal reproducible example。
-
因为注释太长而重写;修复了真实的格式,由于某种原因它没有保存我的编辑,并且 all 需要代码来重现和解决问题,我无法将其删除。我以前见过更大的代码sn-ps,不确定问题出在哪里。这就是我可以解决我的具体问题的“最小、完整和验证”。
-
如果我们无法重现问题,我们无法帮助您。如果您所做的只是将格式应用于某些代码,我严重怀疑您是否需要数百行。
-
虽然很多人确实不这样做,但他们应该这样做。 stackoverflow 创建minimal reproducible example 页面是为了向人们解释该过程是有原因的。但除此之外,这只是一种很好的编程习惯。随着您获得更多经验,您会发现调试的第一步是尽可能地减少问题,同时仍然能够重现问题。通常,创建 mcve 的操作本身就足以说明问题,以便您自己解决。
标签: python performance tkinter syntax-highlighting pygments