【发布时间】: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