Стиль заголовка Tkinter Treeview



Я хочу изменить цвет фона заголовков treeview. Я определил опцию элемента Treeview.Макет заголовка, ответственный за это: Treeheading.ячейка. Проблема в том, что эта настройка не работает на тему "vista" (из-за проблем с рисованием, я полагаю).



Рабочий код (тема выглядит ужасно, хотя):



from tkinter import *
from tkinter import ttk

p=Tk()

separator = PanedWindow(p,bd=0,bg="#202322",sashwidth=2)

separator.pack(fill=BOTH, expand=1)

_frame = Frame(p,bg="#383838")

t=ttk.Treeview(_frame)

t["columns"]=("first","second")
t.column("first",anchor="center" )
t.column("second")
t.heading("first",text="first column")
t.heading("second",text="second column")
t.insert("",0,"dir1",text="directory 1")
t.insert("dir1","end","dir 1",text="file 1 1",values=("file 1 A","file 1 B"))
id=t.insert("","end","dir2",text="directory 2")
t.insert("dir2","end",text="dir 2",values=("file 2 A","file 2 B"))
t.insert(id,"end",text="dir 3",values=("val 1 ","val 2"))
t.insert("",0,text="first line",values=("first line 1","first line 2"))
t.tag_configure("ttk",foreground="black")

ysb = ttk.Scrollbar(orient=VERTICAL, command= t.yview)
xsb = ttk.Scrollbar(orient=HORIZONTAL, command= t.xview)
t['yscroll'] = ysb.set
t['xscroll'] = xsb.set

print(ttk.Style().theme_names())

ttk.Style().theme_use('default')


ttk.Style().configure("Treeview", background="#383838",foreground="white")
ttk.Style().configure("Treeview.Heading",background = "blue",foreground="Black")
p.configure(background='black')

t.grid(in_=_frame, row=0, column=0, sticky=NSEW)
ysb.grid(in_=_frame, row=0, column=1, sticky=NS)
xsb.grid(in_=_frame, row=1, column=0, sticky=EW)
_frame.rowconfigure(0, weight=1)
_frame.columnconfigure(0, weight=1)

separator.add(_frame)

w = Text(separator)
separator.add(w)

p.mainloop()


Моя попытка использовать тему "vista":



ttk.Style().element_create("Treeheading.cell","from","default")

ttk.Style().configure("Treeview", background="#383838",foreground="white")
ttk.Style().configure("Treeview.Heading",background = "Blue")


Element_create работал и в других случаях этой проблемы, но с другими штучки.
Спасибо, любая помощь будет оценена.



Работа в python 3. Кроме того, код не мой, я нашел его и использовал для тестирования.

954   1  

1 ответ:

Вы на правильном пути, но вам нужно изменить элемент границы, а не элемент ячейки. При работе с Windows ячейки treeview отображаются с помощью системного элемента темы из API визуальных стилей. В данном случае это часть HP_HEADERITEM из класса HEADER. Поскольку это нарисовано движком системных тем, вы не можете настроить его из Tk, кроме выбора альтернативных взглядов в соответствии с состоянием.

Если вы должны настроить затем вы должны заменить часть темы на ту, которую Tk может настроить, и тема default является хорошим выбором. Я бы также рекомендовал вам определить это как пользовательский стиль, чтобы вы могли повторно стилизовать определенные виджеты и не обязательно все из них.

style = ttk.Style()
style.element_create("Custom.Treeheading.border", "from", "default")
style.layout("Custom.Treeview.Heading", [
    ("Custom.Treeheading.cell", {'sticky': 'nswe'}),
    ("Custom.Treeheading.border", {'sticky':'nswe', 'children': [
        ("Custom.Treeheading.padding", {'sticky':'nswe', 'children': [
            ("Custom.Treeheading.image", {'side':'right', 'sticky':''}),
            ("Custom.Treeheading.text", {'sticky':'we'})
        ]})
    ]}),
])
style.configure("Custom.Treeview.Heading",
    background="blue", foreground="white", relief="flat")
style.map("Custom.Treeview.Heading",
    relief=[('active','groove'),('pressed','sunken')])

Мы определяем новый стиль виджета, используя тот же макет, что и для стандартного стиля treeview, и заменяем элемент границы. Хотя мы не определили другие пользовательские элементы, они будут просмотрены иерархически так в отсутствие a Custom.Treeheading.text он будет использовать a Treeheading.text. Чтобы использовать это, мы задаем стиль элемента управления TreeView виджет:

t=ttk.Treeview(_frame, style="Custom.Treeview")

В конечном итоге выглядит так в Windows 10:

скриншот пользовательского treeview

Comments

    Ничего не найдено.