Idlelib tkinter 语法高亮 reset/update/removal

Idlelib tkinter syntax highlighting reset/update/removal

我正在制作一个 IDE,它使用 idlelib percolator 和 colordelegator 来突出显示语法。在我的特殊文本小部件初始化函数中,它运行:

import idlelib.colorizer as ic
import idlelib.percolator as ip
        self.cdg = ic.ColorDelegator()
        self.cdg.prog = re.compile(r"\b(?P<MYGROUP>tkinter)\b|" + ic.make_pat(), re.S)
        self.cdg.idprog = re.compile(r"\s+(\w+)", re.S)
        self.cdg.tagdefs["MYGROUP"] = {"foreground": tag_mygroup, "background": "#FFFFFF"}
        self.cdg.tagdefs["COMMENT"] = {"foreground": tag_comment, "background": "#FFFFFF"}
        self.cdg.tagdefs["KEYWORD"] = {"foreground": tag_keyword, "background": "#FFFFFF"}
        self.cdg.tagdefs["BUILTIN"] = {"foreground": tag_builtin, "background": "#FFFFFF"}
        self.cdg.tagdefs["STRING"] = {"foreground": tag_string, "background": "#FFFFFF"}
        self.cdg.tagdefs["DEFINITION"] = {"foreground": tag_definition, "background": "#FFFFFF"}
        self.cdg.tagdefs["CLASS"] = {"foreground": tag_class, "background": "#FFFFFF"}
        ip.Percolator(self.text).insertfilter(self.cdg)

这会按照预期的方式突出显示文本小部件的语法。我想允许用户更改设置文件中的颜色代码,然后 reset/update 或删除然后重新应用使用新颜色突出显示的语法。问题是,当我尝试使用 ip.Percolator(self.text).removefilter(self.cdg) 删除突出显示时,它给出了错误:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/__init__.py", line 1892, in __call__
    return self.func(*args)
  File "/Users/joshyacky/Documents/PyApps/Working/JDE/JDE.py", line 129, in reset_syntax_colors
    main_text_box.reset_colors()
  File "/Users/joshyacky/Documents/PyApps/Working/JDE/custom_widgets.py", line 95, in reset_colors
    ip.Percolator(self.text).removefilter(self.cdg)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/idlelib/percolator.py", line 10, in __init__
    self.redir = WidgetRedirector(text)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/idlelib/redirector.py", line 44, in __init__
    tk.call("rename", w, self.orig)
_tkinter.TclError: can't rename to ".!ultra_text.!text_orig": command already exists

关于如何删除或更新语法突出显示的任何想法?

我建议查看 IDLE 如何更新颜色。当在设置对话框中单击或选择 [Ok] 时,将在每个编辑器 window 上调用 window.ResetColorizer。这是在 idlelib/editor.py 的第 797 行中定义的。这又调用了前面几行中定义的 _rmcolorizer 和 _addcolorizer。 (该函数的其余部分是特定于 IDLE 的。)_rmcolorizer 首先在 per.removefilter 之前调用现有的 ColorDelegator().removecolors。 _addcolorizer 此后在调用 per.insertfilter 之前创建一个新的 ColorDelegator()。我不知道这一切是否绝对必要,但它确实有效。

您正在使用几乎未记录的私有代码。不支持第三方使用。但是,我愿意接受建议,例如为这些模块提供更好的文档,这将(也)有助于它们在 IDLE 中的使用。