tkinter ttk.Treeview: changing background colour of single item when selected

Thomas Passin list1 at tompassin.net
Sun Feb 12 08:59:03 EST 2023


On 2/12/2023 6:10 AM, John O'Hagan wrote:
> On Mon, 2023-02-06 at 10:19 -0800, stefalem wrote:
>> Il giorno sabato 4 febbraio 2023 alle 11:43:29 UTC+1 John O'Hagan ha
>> scritto:
>> ...
>>
>>> Is there another way to do what I want?
>>
>> from tkinter import *
>> from tkinter.ttk import *
>>
>> root = Tk()
>> t = Treeview(root)
>>
>> t.insert('', 0, iid='item1', text='item1')
>> t.insert('', 1, text='item2')
>> t.tag_configure('flashtag', background='red')
>> t.pack()
>>    
>> def flash():
>>   tags = t.item('item1', 'tags')
>>   t.item('item1', tags='' if tags else 'flashtag')
>>   t.after(500, flash)
>>   itemselected = t.selection()
>>   for x in itemselected:
>>    if (x == 'item1'):
>>     t.selection_remove(t.get_children())
>>
>> flash()
> 
> Thank you for your reply. Unfortunately that's not quite what I'm
> after, because it unselects the flashing item.
> 
> My goal was to be able to change the colour of an individual item
> regardless of whether it is selected or not. To do that, it is
> necessary to be able to change the colour of an individual selected
> item, without changing the selection or changing the colour of other
> selected items. It seems this isn't possible.

I haven't worked with ttk objects or Treeviews, but judging from old 
style objects, I think you have to re-apply your color and flashing when 
the item becomes selected and possibly again when it becomes unselected.

Depending on exactly what effect you want, you may also need to apply 
color and flashing when the mouse moves over the item and again when it 
leaves.  When I make changes in e.g. color, I like to save the previous 
value(s) in the object itself.  That way I can easily restore say a 
background color without having to work out what it used to be, which 
may be some color that Tk applies based on the desktop theme and who 
know what else.

Here's an example (simplified) for changing color on mouse hover and 
leave events:

BG_KEY = 'bg' if platform.lower().startswith('win') \
          else 'activebackground'  # Different for Linux!

def on_enter(event):
     w = event.widget
     w.old_bg = w.cget('bg')
     w[BG_KEY] = BUTTON_HOVER  # Color you have chosen

def on_leave(event):
     w = event.widget
     _bg = w.old_bg
     w[BG_KEY] = _bg




More information about the Python-list mailing list