5

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() 
j_4321
  • 15,431
  • 3
  • 34
  • 61
Daniel Huckson
  • 1,157
  • 1
  • 13
  • 35
  • Does this answer your question? [TKinter Style & Treeview Click Issues](https://stackoverflow.com/a/60875806/7414759) – stovfl Apr 12 '20 at 10:53

1 Answers1

5

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.

j_4321
  • 15,431
  • 3
  • 34
  • 61
  • @stovfl I don't understand your comment, the answer you link is about changing item background colors with tags whereas, in my understanding the OP's question is about the selected row background color. However the question you link in your comment to the question is indeed relevant. – j_4321 Apr 12 '20 at 11:22
  • @stovfl Ok thanks, I have added the link in the answer – j_4321 Apr 12 '20 at 11:46
  • Thank you for your answer that was just what I needed. – Daniel Huckson Apr 12 '20 at 15:39