Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tkinter Treeview issue when inserting rows with tags

I have just switched from python 3.6 to python 3.7. I have a function which inserts rows in a Treeview tree with tags. The tags are used for giving a foreground color and a background color to the rows inserted to the tree. My code was working ok when I was using python 3.6. Once I switched to 3.7 the rows inserted were not given a background or foreground color but where only given a white background and a black foreground color.

There doesn't seem to be a syntax change in tkinter.ttk from python 3.6 to 3.7 regarding tag configuration or tree insert.

tree.tag_configure('MATCHED', foreground='dark green', background='gray98')
tree.tag_configure('UNMATCHED', foreground='red2', background='gray98')

if match_status== '1':
    tree.insert('', 'end', text=df_row, values=my_value, tag='MATCHED')
elif match_status == '0':
    tree.insert('', 'end', text=df_row, values=my_value, tag='UNMATCHED')`

It is expected that when the rows are inserted to the tree to be given the correct background and foreground color.

Any help is appreciated.

like image 990
Andreas P. Avatar asked Apr 25 '19 08:04

Andreas P.


1 Answers

Looks like the issue was caused by a newer version of tkinter, not a newer version of Python. This was reported in https://bugs.python.org/issue36468 and https://core.tcl-lang.org/tk/info/509cafafae

Here is a proposed solution. It should be both backward and forward compatible:

def fixed_map(option):
    # Fix for setting text colour for Tkinter 8.6.9
    # From: https://core.tcl.tk/tk/info/509cafafae
    #
    # Returns the style map for 'option' with any styles starting with
    # ('!disabled', '!selected', ...) filtered out.

    # style.map() returns an empty list for missing options, so this
    # should be future-safe.
    return [elm for elm in style.map('Treeview', query_opt=option) if
        elm[:2] != ('!disabled', '!selected')]

style = ttk.Style()
style.map('Treeview', foreground=fixed_map('foreground'), background=fixed_map('background'))
like image 117
Jakaria Avatar answered Sep 19 '22 09:09

Jakaria