Tkinter文本标签选择/用户高亮颜色
我在使用Tkinter的Text组件时,给一些文本加了标签,但在某些行的背景颜色变成了浅灰色或蓝色。不过,当用户选中这些行时,文本的颜色和选中后的颜色之间的区别不太明显。我想知道在我的标签配置方法中,有没有什么选项可以用来改变选中的颜色?目前的代码看起来是这样的:
self.text.tag_config("oddLine", background="#F3F6FA")
这是用户还没有选中文本时的截图:

而选中后,用户选中的中间那一行也很难看出来:
我该如何调整选中颜色,让用户选中的文本和背景颜色看起来更一致,这样那些背景颜色和选中颜色相似的行就不会显得那么混淆了。
2 个回答
1
我不知道有没有办法为一个文本标签指定高亮颜色。
我看到有两种方法可以解决你的问题。第一种方法是让 "sel"
标签的优先级高于你的 oddLine
标签,正如 Bryan 指出的那样。文本标签的顺序是根据它们创建的顺序来排列的(最后创建的在其他标签上面)。默认的 "sel"
标签是在小部件创建时生成的,因此它的位置会在之后添加的标签下面。
第二种方法是计算你的标签和 "sel"
标签之间的交集,以提供自定义样式。这里有一段代码可以实现这个效果。
import Tkinter as tk
t = tk.Text()
t.pack()
t.insert(tk.END, "Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
t.tag_config("foo", background="yellow", foreground="red")
t.tag_add("foo", "1.6", "1.11")
t.tag_add("foo", "1.28", "1.39")
t.tag_config("sel_intersection", background="orange")
def sel_manager(event):
t = event.widget
tag_remove_all (t, "sel_intersection")
f = map(TextIndex, t.tag_ranges("foo"))
s = map(TextIndex, t.tag_ranges("sel"))
if (len(s) == 0):
return
for f_start, f_end in zip(f[::2],f[1::2]):
t.tag_add("sel_intersection", max(s[0],f_start), min(s[1], f_end))
def tag_remove_all(widget, tag_name):
ranges = map(str, t.tag_ranges(tag_name))
for s, e in zip(ranges[::2], ranges[1::2]):
widget.tag_remove(tag_name, s, e)
class TextIndex:
'''needed for proper index comparison, ie "1.5" < "1.10"
'''
def __init__(self, textindex):
self._str = str(textindex)
self._l , self._c = map(int, self._str.split('.'))
def __cmp__(self, other):
cmp_l = cmp(self._l, other._l)
if cmp_l !=0:
return cmp_l
else:
return cmp(self._c, other._c)
def __str__(self):
return self._str
t.bind("<<Selection>>", sel_manager)
t.mainloop()
7
标签是有优先级的。现在发生的情况是,你的标签优先级比选择的标签高。如果你降低你的标签的优先级,或者提高sel
标签的优先级,选择的内容就会更明显。
试试这个:
self.text.tag_raise("sel")