0

我目前正在为一种建模语言开发一个文本编辑器(在 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 注释的颜色正确,但第二个不正确。由于项目太大,这里贴不上来,这里放一个链接。示例模型位于源目录中。

4

1 回答 1

0

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

而不是使用index(),使用

for number, line in enumerate(complete_text_as_lines):

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


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

于 2018-08-30T11:30:18.660 回答