我目前正在为一种建模语言开发一个文本编辑器(在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。源目录中有一个示例模型。
答案 0 :(得分:0)
据我所知,您的问题似乎在于重复行。当两行或更多行相同时,complete_text_as_lines.index(line)
将返回第一行。
使用
代替使用index()
for number, line in enumerate(complete_text_as_lines):
那样,number
将始终是正确的行号(在您执行+1之后)
我还注意到,因为您将背景设置为白色,所以selectbackground
也为白色,这使得看不到您选择的内容。要使标准的突出显示颜色selectbackground="SystemHighlight"
对我有用。