Python 2.7 Tkinter 标签虽然处于活动状态但未显示

Python 2.7 Tkinter Tags not shown although active

我目前正在为一种建模语言开发文本编辑器(在 Python 2.7 中)。一切都按预期工作,除了 tkinker 在将许多标签添加到文本小部件的情况下的行为。为了在模型中突出显示注释,我使用循环遍历整个文本,找到包含“#”标记的每一行,收集该符号的起点,然后标记整行(从 # 开始) ) 作为评论:

def color_sl_comments(self):
    complete_text_as_lines = self.text.get('1.0', tk.END + '-1c').splitlines()
    for line in complete_text_as_lines:
        if '#' in line:
            s_l = complete_text_as_lines.index(line) + 1
            s_c = line.index('#')
            e_l = s_l
            e_c = len(line)
            self.color_comment(s_l, s_c, e_l, e_c)

def color_comment(self, sl, sc, el, ec):
    name = "comment%s.%s.%s.%s." % (sl, sc, el, ec)
    self.text.tag_add(name, "%s.%s" % (sl, sc), "%s.%s" % (el, ec))
    self.text.tag_config(name, background="white", foreground="grey")

第一个评论的颜色已按预期更改,但最后一个仍保留默认着色模式。但是调试代码后发现,对应的tag是给text赋值的,即tag都在,只是window里面的颜色根本没变。 更有趣的一点是:如果我更新相应的评论,例如添加一个额外的字符,那么评论颜色会正确显示。删除此字符会恢复着色模式,并且文本不再显示为注释。 这似乎是 tkinker 中的一个错误,尽管存在,但并未显示所有标签。代码的不同部分做完全相同的事情,但用于多行注释。在这里,第一个 ML 注释的颜色是正确的,但第二个不是。 由于项目太大,这里贴一个link。示例模型位于源目录中。

据我所知,您的问题似乎与重复行有关。当两行或更多行相同时,complete_text_as_lines.index(line) 将 return 第一行。

不使用index(),而是使用

for number, line in enumerate(complete_text_as_lines):

这样,number 将始终是正确的行号(在您 +1 之后)


我还注意到,因为您将背景设置为白色,所以 selectbackground 也是白色的,这使得您无法看到您选择的内容。使用标准高亮颜色 selectbackground="SystemHighlight" 对我有用。