在tkinter文本小部件中有效地应用文本小部件标记

时间:2014-11-29 22:02:24

标签: python performance tkinter syntax-highlighting lexical-analysis

我试图在“文本”小部件中为文本实现语法突出显示。

我使用外部库对词汇进行词汇分析并给出标记化的文本。之后,我查看文本中的所有单词,并将标记应用到文本小部件中的位置,以便我可以为每个单词设置样式。

我现在关注的是如何应对变化。每次用户按下某个键时,我都会再次对整个文本进行标记,并将样式标记添加到整个文本的文本小部件中。事实证明这很慢。 然后我转换到仅对插入字符的行进行突出显示过程以使其更快但这会产生错误的结果并且突出显示现在并不完美。

快速和完美之间的理想折衷方案是什么?这样做的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

一个可能的答案是做一些像Idle这样的事情。当用户点击每个键时,其自定义增量解析器标记关键字,内置或def /类名*的标识符。它还标记作为字符串或注释的分隔字符序列。我做得很快就可以做到。

例如,如果一个printer类型不在字符串或注释中,则Idle会在每个键后检查该单词是关键字还是内置名称。点击t后,print会被标记。输入e(或任何其他标识符char)后,printe未标记。

我认为部分代码位于idlelib/Hyperparser.py,部分代码位于ColorDelegator.py。您可以自由复制和调整代码,但请不要直接使用它,因为API可能会更改。我假设解析器根据当前状态(在def / class之后,在标识符,注释,字符串等中)执行所需的最小值。

Idle有一个重新定位的功能来重新整理整个文件。我认为'这与增量着色器是分开的,但我没有阅读所有相关代码。如果编辑一个足够长的文件,例如idlelib/EditorWindow.py(大约3000行),并更改字体大小,则Idle会删除该文件(我不知道为什么)。文件变为全黑并且被重新着色之间存在明显的延迟。你绝对不希望每次击键都有这种延迟。

  • 在3.x中尚未正确识别具有非ascii字符的类/函数名称,但应该是。修补程序坚持决定更快的准确方法。相比之下,识别ascii-only(2.x)标识符是微不足道的。

PS我正确地猜测你有兴趣标记除Python代码以外的东西吗?