如何在 Treeview 中编辑标题的样式(Python ttk)

Posted

技术标签:

【中文标题】如何在 Treeview 中编辑标题的样式(Python ttk)【英文标题】:How to edit the style of a heading in Treeview (Python ttk) 【发布时间】:2015-11-10 04:08:06 【问题描述】:

我正在尝试使用 ttk.Treeview 制作一个可排序的表(根据 Does tkinter have a table widget? 和 https://www.daniweb.com/software-development/python/threads/350266/creating-table-in-python)。

让它工作起来很容易,但我在样式方面遇到了一些问题。 Treeview 标题的默认样式是白色背景上的黑色文本,这很好。但是,在我使用的代码中:

ttk.Style().configure(".", font=('Helvetica', 8), foreground="white")

格式化我的 GUI。这种总体风格也会影响 Treeview 小部件的标题。因为默认标题背景是白色的,所以我看不到文本(除非我将鼠标悬停在标题上,它会变成浅蓝色)。

通常,我会使用标签覆盖小部件的样式以更改背景或前景,但我终生无法弄清楚如何调整 Treeview 标题! ttk.Treeview(...) 不接受任何标签,并且 ttk.Style().configure("Treeview", ...) 没有效果。使用 widget.insert(...) 时,只有 Treeview 项目似乎接受标签。

这让我感到困惑,因为总体 ttk.Style().configure(".",...) 确实会影响 Treeview 标题,因此应该可以对它们应用标签.

有人知道如何更改 Treeview 标题的样式吗?

以下是一个最低限度的工作示例。请注意,该标签适用于项目,但不适用于标题,Treeview 样式无效,并且“。”风格确实有影响。我在 Windows 7 上使用 Python 2.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()

【问题讨论】:

【参考方案1】:

这在我所在的地方有效 -

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

【讨论】:

你是英雄!谢谢:)【参考方案2】:

您可以使用默认命名字体“TkHeadingFont”更改 Treeview 标题中使用的字体。

例如:

font.nametofont('TkHeadingFont').configure(size = 15)

【讨论】:

以上是关于如何在 Treeview 中编辑标题的样式(Python ttk)的主要内容,如果未能解决你的问题,请参考以下文章

如何使 ttk.Treeview 的行可编辑?

在编辑节点 (C#) 时为 TreeView 提交更改很热?

将样式应用于所有 TreeViewItem

减少 TreeView 使用的水平空间

在 excel TreeView VBA 中编辑节点

如何访问服务器上的 Jquery TreeView?