有效的Python 2.7 Tkinter标签未显示

时间:2018-08-30 09:58:24

标签: python tkinter tags text-widget

我目前正在为一种建模语言开发一个文本编辑器(在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注释的颜色正确,但是第二个ML注释的颜色不正确。 由于项目太大,无法在此处粘贴,因此这里为link。源目录中有一个示例模型。

1 个答案:

答案 0 :(得分:0)

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

使用

代替使用index()
for number, line in enumerate(complete_text_as_lines):

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


我还注意到,因为您将背景设置为白色,所以selectbackground也为白色,这使得看不到您选择的内容。要使标准的突出显示颜色selectbackground="SystemHighlight"对我有用。