我目前正在为一种建模语言开发一个文本编辑器(在 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")
第一条评论的颜色按预期更改,但最后一条评论保持默认着色模式。但是,调试完代码后发现,给文本赋值了对应的标签,即所有的标签都在,但是窗口中的颜色根本没有改变。更有趣的一点是:如果我更新相应的评论,例如,添加一个额外的字符,那么评论颜色就会正确显示。删除此字符会还原着色模式,并且文本不再显示为注释。这似乎是 tkinker 中的一个错误,尽管所有标签都在那里,但并未显示所有标签。代码的不同部分执行完全相同的操作,但用于多行注释。在这里,第一个 ML 注释的颜色正确,但第二个不正确。由于项目太大,这里贴不上来,这里放一个链接。示例模型位于源目录中。