Hi list
I'm using a ttk Treeview to display a hierarchical data structure. When
an error condition arises in a node, I want the corresponding item in
the Treeview to flash its background color.
Using a tag to flash the item background works, except when the item is selected, when the tag has no effect. I want the item to keep flashing
even when selected.
The code below is a minimal example of the issue. It displays a
Treeview containing two items with the first one flashing. If you
select it, you don't see the flashing anymore.
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)
flash()
mainloop()
Other than tags, the only other way I've found to dynamically change
Treeview backgrounds is using styles, in particular Style.map to
configure the background of a selected item, but they apply to all
items in the Treeview and would flash all selected items, not just the
one I want to keep flashing.
Is there another way to do what I want?
Thanks
--
John
Is there another way to do what I want?
Is there another way to do what I want?
Is there another way to do what I want?
Thanks
--
John
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()
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.
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.
On 2/12/2023 6:10 AM, John O'Hagan wrote:
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
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 546 |
Nodes: | 16 (2 / 14) |
Uptime: | 53:36:24 |
Calls: | 10,397 |
Calls today: | 5 |
Files: | 14,067 |
Messages: | 6,417,401 |
Posted today: | 1 |