您链接到的问题中的代码更多地是为了突出显示已经存在的文本而设计的,而看起来您正在尝试在键入时突出显示它。
我可以提供一些建议来帮助您入门,尽管我从未这样做过并且不知道最有效的解决方案是什么。此答案中的解决方案只是一个起点,不能保证它确实适合您的问题。
简短的概要是这样的:不要设置插入任何内容的绑定。相反,只需突出显示默认绑定插入的内容即可。
为此,第一步是绑定<KeyRelease>
而不是<Key>
。不同之处在于<KeyRelease>
将会发生after已插入一个字符,而<Key>
发生before一个字符被插入。
其次,您需要从词法分析器获取标记,并将标签应用于每个标记的文本。为此,您需要跟踪词法分析器在文档中的位置,然后使用标记的长度来确定标记的结尾。
在以下解决方案中,我创建了一个标记("range_start"
) 指定 pygments 词法分析器在文件中的当前位置,然后计算标记"range_end"
基于开始以及 pygments 返回的令牌的长度。我不知道这在面对多字节字符时有多稳健。现在,我们假设单字节字符。
def syn(event=None):
textPad.mark_set("range_start", "1.0")
data = textPad.get("1.0", "end-1c")
for token, content in lex(data, PythonLexer()):
textPad.mark_set("range_end", "range_start + %dc" % len(content))
textPad.tag_add(str(token), "range_start", "range_end")
textPad.mark_set("range_start", "range_end")
这是非常低效的,因为它会在每次按键时重新将突出显示应用于整个文档。有一些方法可以最大限度地减少这种情况,例如仅在每个单词之后突出显示,或者当 GUI 空闲时,或者某种其他类型的触发器。