我可以设置树视图层次结构按钮的样式吗?

问题描述 投票:0回答:2

我只是不喜欢这些 +- 按钮(显示或隐藏子数据)的样子,在我看来已经过时了。我想将它们更改为其他一些元素(例如简单的三角形或图像/图标)。所以改变这个:

像这样:

我认为样式可以提供帮助,但似乎没有选项可以更改这些按钮的外观。也许一个原因是,据我所知,这些按钮取决于所使用的系统(对于 Microsoft,它们是 +-,在 Linux 上可能是三角形),所以也许这就是我无法配置它们的原因。

python-3.x tkinter ttk
2个回答
1
投票

应该可以创建更改这些图像的自定义样式。我不是样式方面的专家,但是 tkdocs.com 上的描述 应该可以为您提供有关如何操作的提示。

您还可以在互联网上搜索 tkinter 样式,看看它们是否符合您的要求。例如,ttkthemes有几个使用树中不同类型图像的主题。


1
投票

我找到了一种无需使用主题即可做到这一点的方法。它并不复杂,但需要知识才能使用它。

光解决方案:

首先,我创建 3 张图像,尺寸均为 16 x 16 像素。该尺寸完美适合线条之间的间距,但您可以将它们更改为更适合您的尺寸。

其次,我使用“element_create”更改默认按钮图像(默认为加减)。这个东西叫做“指示器”,它保存这个“按钮”的图像。那么代码应该很简单。 “图像”是文件夹关闭时的样子 ()。 'user1' 是它们被打开的时间 ()。 “user2”适用于文件夹(而不是子文件夹)中的项目。我不想让它显示一些东西,所以我使用大小为 1 像素的透明图像。宽度和高度是为了使指示器完美贴合图像。

我还配置了 Treeview.Item 以在左侧留出额外的空间。不是真的需要。

最后,创建一个树视图。所以代码如下:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
style = ttk.Style()

# Images I will use (all have a size of 16 by 16 pixels):
images = {
    "folder_closed": tk.PhotoImage(file="folder1.png"),
    "empty": tk.PhotoImage(file="emptypixel.png"),
    "folder_opened": tk.PhotoImage(file="folder2.png")
}

"""
Treeview structure:
Treeview:   Treeview.field( Treeview.padding( Treeview.treearea))
Treeview.Heading:   Treeheading.cell; Treeheading.border( Treeheading.padding( Treeheading.image; Treeheading.text))
Treeview.Cell:   Treedata.padding( Treeitem.text)
Treeview.Item:   Treeitem.padding( Treeitem.indicator; Treeitem.image; Treeitem.text)
"""

style.element_create("Treeitem.indicator",
                     "image", images["folder_closed"],  # for a folder when it is 'closed'
                     ("user1", images['folder_opened']),  # when folder is opened
                     ("user2", images['empty']),  # for a file in a folder (not subfolder). By default same as folders
                     width=16, height=16)  # mine image sizes



style.configure('Treeview.Item', padding=(5, 0))  # may be omitted


# Create you tree!
treeview = ttk.Treeview(root, show='tree')

一个可能有助于修复的缺点:此样式将用于文件中的所有树视图。这并不总是我们想要的。

复杂的解决方案:

我正在添加自定义样式。这是通过向项目和指示器添加前缀“自定义”(可以是任何名称)来实现。这会继承默认的树元素。需要重新创建“Item”的布局,因为应添加新指示器而不是默认指示器。所以代码:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
style = ttk.Style()

# Images I will use (all have a size of 16 by 16 pixels):
images = {
    "folder_closed": tk.PhotoImage(file="folder1.png"),
    "empty": tk.PhotoImage(file="emptypixel.png"),
    "folder_opened": tk.PhotoImage(file="folder2.png")
}

# this is used to make extra scape from the icons of folders to the rest of the line.
imageToText_padx = 4

style.element_create("Custom.Treeview.indicator",
                     "image", images["folder_closed"],  # for a folder when it is 'closed'
                     ("user1", images['folder_opened']),  # when folder is opened
                     ("user2", images['empty']),  # for a file in a folder (not subfolder). By default same as folders
                     width=16 + imageToText_padx, height=16, sticky='wns')


style.layout("Custom.Treeview.Item", [
        ("Treeitem.padding", {"sticky": "nswe", "children":
            [
             ("Custom.Treeview.indicator", {"side": "left", "sticky": ""}),
             ("Treeitem.image", {"side": "left", "sticky": ""}),
             ("Treeitem.text", {"side": "left", "sticky": ""})
             ]
         })
    ])

style.configure('Custom.Treeview.Item', padding=(5, 0))  # may be omitted


# Apply the custom style to the treeview and create you tree!
treeview = ttk.Treeview(root, style='Custom.Treeview', show='tree')

这可以在一个程序中创建:

我还通过将“element_create”中的“宽度”增加一些数字来增加文件夹图标和行的其余部分之间的空间。

结论:样式非常强大,如果您知道如何使用它们。它确实可以改变小部件的外观。不幸的是,它们没有很好的记录。

© www.soinside.com 2019 - 2024. All rights reserved.