Tkinter文本标签选择/用户高亮颜色

3 投票
2 回答
1844 浏览
提问于 2025-04-18 04:12

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

self.text.tag_config("oddLine", background="#F3F6FA")

这是用户还没有选中文本时的截图:

Before highlight

而选中后,用户选中的中间那一行也很难看出来:

After Highlighting

我该如何调整选中颜色,让用户选中的文本和背景颜色看起来更一致,这样那些背景颜色和选中颜色相似的行就不会显得那么混淆了。

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")

撰写回答