Я пытаюсь использовать 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()