Tkinter文本标签选择/用户突出显示颜色

时间:2014-04-25 09:29:03

标签: python tkinter

我在我的Tkinter Text小部件中使用标签但在某些行上背景颜色变为浅灰/蓝色但是当用户突出显示这些行时,文本之间的颜色是否明显以及是否已突出显示。有没有我可以添加到我的标签配置方法调用以更改突出显示颜色的选项?目前它看起来像:

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

以下是用户突出显示文字之前的截图: Before highlight

之后很难注意到用户突出显示了中间行:

After Highlighting

如何获得用户选择的颜色更加一致,以使背景类似于突出显示颜色的线看起来相似。

2 个答案:

答案 0 :(得分:6)

标签优先。发生的事情是您的标签的优先级高于选择。如果您降低代码的优先级,或提高sel代码的优先级,则选择将更加明显。

试试这个:

self.text.tag_raise("sel")

答案 1 :(得分:1)

我不知道为Text标签指定高亮颜色的方法。

我认为有两种方法可以解决您的问题,第一种方法是将"sel"代码优先于oddLine代码,pointed by 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()