2014-04-25 158 views
3

我在Tkinter文本窗口小部件中使用了標籤,但在某些線條上,背景顏色更改爲淺灰色/藍色,但是當用戶高亮顯示這些線條時,文本之間的顏色不明顯以及是否突出顯示。有沒有我可以添加到我的標記配置方法調用更改高亮顏色的選項?目前,它看起來像:Tkinter文本標籤選擇/用戶高亮顯示顏色

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

這裏是它的外觀,用戶突出顯示文本之前的截圖: Before highlight

而且後很難發現,用戶已經強調了中間路線:

After Highlighting

如何獲得用戶選擇的顏色更加一致,以便具有與突出顯示顏色相似的背景的線條看起來類似。

+0

我不明白這個問題。如果你有一個灰色的背景,用戶選擇它,你想繼續看到灰色背景,或者你期望看到高光背景?無論原始顏色如何,大多數編輯都顯示相同的高光顏色,因此您始終可以知道所選內容。 –

+0

@BryanOakley看我的編輯。 – Dean

回答

6

標籤具有優先權。發生的事情是你的標籤比選擇的優先級更高。如果您降低標籤的優先級,或提高sel標籤的優先級,則選擇將更加明顯。

試試這個:

self.text.tag_raise("sel") 
1

我不知道的方式來指定文本標籤的高亮顏色。

我看到兩種方法可以解決您的問題,第一種方法是給"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()