Как редактировать стиль заголовка в 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()

person Koen Peters    schedule 17.08.2015    source источник


Ответы (2)


это работает там, где я -

style = ttk.Style()
style.configure(".", font=('Helvetica', 8), foreground="white")
style.configure("Treeview", foreground='red')
style.configure("Treeview.Heading", foreground='green') #<----

http://www.tkdocs.com/tutorial/styles.html

person Oblivion    schedule 20.08.2015
comment
Ты герой! Спасибо :) - person Koen Peters; 20.08.2015

Вы можете изменить шрифт, используемый в заголовках Treeview, используя именованный шрифт по умолчанию «TkHeadingFont».

Eg:

font.nametofont('TkHeadingFont').configure(size = 15)
person Emmaline Cooke    schedule 20.01.2016