python tkinter 文本小部件中的 Pygments 语法荧光笔

2023-12-13

我一直在尝试将语法突出显示与 tkinter 文本小部件结合起来。但是,使用上找到的代码这个帖子,我无法让它工作。没有错误,但文本未突出显示,并且每个字符后会跳过一行。如果有更好的方法将语法突出显示与 tkinter 文本小部件结合起来,我会很高兴听到它。这是我能找到的复制该问题的最小代码:

import Tkinter
import ScrolledText
from pygments import lex
from pygments.lexers import PythonLexer

root = Tkinter.Tk(className=" How do I put an end to this behavior?")
textPad = ScrolledText.ScrolledText(root, width=100, height=80)
textPad.tag_configure("Token.Comment", foreground="#b21111")
code = textPad.get("1.0", "end-1c")
# Parse the code and insert into the widget
def syn(event=None):
    for token, content in lex(code, PythonLexer()):
        textPad.insert("end", content, str(token))
textPad.pack()
root.bind("<Key>", syn)
root.mainloop()

到目前为止,我还没有找到解决这个问题的方法(否则我不会在这里发帖)。任何有关语法突出显示 tkinter 文本小部件的帮助将不胜感激。

注意:这是在 Windows 7 上的 python 2.7 上进行的。


您链接到的问题中的代码更多地是为了突出显示已经存在的文本而设计的,而看起来您正在尝试在键入时突出显示它。

我可以提供一些建议来帮助您入门,尽管我从未这样做过并且不知道最有效的解决方案是什么。此答案中的解决方案只是一个起点,不能保证它确实适合您的问题。

简短的概要是这样的:不要设置插入任何内容的绑定。相反,只需突出显示默认绑定插入的内容即可。

为此,第一步是绑定<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 空闲时,或者某种其他类型的触发器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python tkinter 文本小部件中的 Pygments 语法荧光笔 的相关文章

随机推荐