Как редактировать стиль заголовка в Treeview (Python ttk)
Я пытаюсь использовать ttk.Treeview для создания сортируемой таблицы (согласно tkinter Есть ли виджет таблицы? И https://www.daniweb.com/software-development/python/threads/350266/creating-table-in-python).
Работать с ним легко, но у меня возникли некоторые проблемы со стилем. Стиль по умолчанию для заголовка Treeview - черный текст на белом фоне. Тем не менее, в моем коде я использую:
ttk.Style().configure(".", font=('Helvetica', 8), foreground="white")
отформатировать мой графический интерфейс. Этот всеобъемлющий стиль также влияет на заголовок виджета Treeview. Так как фон заголовка по умолчанию белый, я не вижу текст (если я не наведу курсор мыши на заголовок, который делает его светло-голубым).
Обычно я бы переопределил стиль виджета, используя тег для изменения фона или переднего плана, но я не могу понять, как настроить заголовки Treeview! ttk.Treeview (...) не принимает никаких тегов, а ttk.Style().configure("Treeview", ...) не имеет никакого эффекта. Только элементы Treeview, по-видимому, принимают теги при использовании widget.insert(...).
Это сбивает меня с толку, потому что всеобъемлющий ttk.Style (). Configure(".",...) действительно влияет на заголовки Treeview, поэтому должна быть возможность применить к ним тег.
Кто-нибудь знает, как изменить стиль заголовка Treeview?
Ниже приведен минимальный рабочий пример. Обратите внимание, что тег работает для элементов, но не для заголовков, что стиль Treeview не имеет никакого эффекта, и что "." стиль имеет эффект. Я использую Python 2.7 на Windows 7 на случай, если что-то изменится.
from Tkinter import *
import ttk
header = ['car', 'repair']
data = [
('Hyundai', 'brakes') ,
('Honda', 'light') ,
('Lexus', 'battery') ,
('Benz', 'wiper') ,
('Ford', 'tire')]
root = Tk()
frame = ttk.Frame(root)
frame.pack()
table = ttk.Treeview(frame, columns=header, show="headings")
table.pack()
## table.tag_configure('items', foreground='blue')
## ttk.Style().configure("Treeview", background='red', foreground='yellow')
## ttk.Style().configure(".", font=('Helvetica', 8), foreground="white")
for col in header:
table.heading(col, text=col.title(), command=lambda c=col: sortby(table, c, 0))
for item in data:
table.insert('', 'end', values=item, tags=('items',))
def sortby(tree, col, descending):
"""sort tree contents when a column header is clicked on"""
# grab values to sort
data = [(tree.set(child, col), child) \
for child in tree.get_children('')]
# if the data to be sorted is numeric change to float
#data = change_numeric(data)
# now sort the data in place
data.sort(reverse=descending)
for ix, item in enumerate(data):
tree.move(item[1], '', ix)
# switch the heading so it will sort in the opposite direction
tree.heading(col, command=lambda col=col: sortby(tree, col, \
int(not descending)))
root.mainloop()
2 ответа
Это работает там, где я -
style = ttk.Style()
style.configure(".", font=('Helvetica', 8), foreground="white")
style.configure("Treeview", foreground='red')
style.configure("Treeview.Heading", foreground='green') #<----
Вы можете изменить шрифт, используемый в заголовках Treeview, используя по умолчанию шрифт TkHeadingFont.
Например:
font.nametofont('TkHeadingFont').configure(size = 15)