Daniel Huckson
Daniel Huckson

Reputation: 1247

Tkinter how to change the color of treeview selected items

How does one go about changing the selected text color in treeview, I can't seem to find much on the subject.

Here is what I have tried but the color doesn't change to red as I would like, it stays blue.

from tkinter import *
from tkinter.ttk import Treeview, Style


class App(Frame):

    def __init__(self, parent):
        super().__init__()
        self.container = Frame.__init__(self, parent)
        style = Style()
        self.tv = None
        self.tree()
        style.configure('Treeview', selectbackground='red')

    def tree(self):
        tv = self.tv = Treeview(self.container)
        tv.grid(sticky='NSEW')

        tv.insert('', '0', 'item1', text='Item 1')
        tv.insert('', '1', 'item2', text='Item 2')
        tv.insert('', '2', 'item3', text='Item 3')

        tv.insert('item1', '0', 'python1', text='Python 1')
        tv.insert('item1', '1', 'python2', text='Python 2')

        tv.insert('python1', '0', 'sub1', text='Sub item 1')
        tv.insert('python1', '1', 'sub2', text='Sub item 2')


def main():
    root = Tk()

    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)
    App(root)

    root.mainloop()


if __name__ == '__main__':
    main() 

Upvotes: 5

Views: 3515

Answers (1)

j_4321
j_4321

Reputation: 16179

The selected background color is not set with a selectbackground option but as a dynamic value of the background option. Therefore to set this option you need to replace

style.configure('Treeview', selectbackground='red')

by

style.map('Treeview', background=[('selected', 'red')])

Which means that when the item is in 'selected' state, its background is red. This can also be used to set a disabled background color for instance.

You can find more information about dynamic appearance change here: https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/ttk-map.html

You can also query the current dynamic values with style.map('Treeview') or style.map('Treeview', 'background') (to get only the list of values for the background).

By the way, as suggested by stovfl, if you also need to change the colors of specific rows, you can have a look at Unable to change background color of treeview in python.

Upvotes: 6

Related Questions