如何用图片替换ttk.Treeview父节点箭头?

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

问题: 如何在 tkinter.ttk.Treeview 中创建一个节点,其中节点的切换箭头被定义的图像替换?也就是说,我如何从第二张图片转到第一张图片,如下所示。

问题:新墨西哥技术指南显示tkinter.ttk.Treeview可以创建如下所示的文件夹目录:

使用带有“image”关键字的 tkinter.ttk.Treeview .insert() 方法,我只能实现以下目标。图像确实出现在节点文本的左侧,但该图像不会替换切换节点的打开和关闭以显示其后代的箭头。我假设由“image”关键字定义的图像将取代切换箭头。但这并没有发生。

测试代码:

import os
import tkinter as tk
import tkinter.ttk as ttk
from PIL import Image, ImageTk

class App(ttk.Frame):

    def __init__(self, master, path):

        ttk.Frame.__init__(self, master)
        self.tree = ttk.Treeview(self)
        ysb = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
        xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tree.xview)
        self.tree.configure(yscroll=ysb.set, xscroll=xsb.set)
        self.tree.heading('#0', text='Directory', anchor='w')

        abspath = os.path.abspath(path)
        i = './icon/Home-icon_16.gif'
        self.root_pic = tk.PhotoImage(file=i)
        root_node = self.tree.insert('', 'end', text='  Work Folder', open=True, image=self.root_pic)
        l1_node = self.tree.insert(root_node, 'end', text='level 1', open=True)
        l2_node = self.tree.insert(l1_node, 'end', text='level 2', open=True)
        l3_node = self.tree.insert(l2_node, 'end', text='level 3', open=True)
        l2a_node = self.tree.insert(l1_node, 'end', text='level 2a', open=True)
        l3a_node = self.tree.insert(l2a_node, 'end', text='level 3a', open=True)

        self.tree.grid(row=0, column=0)
        ysb.grid(row=0, column=1, sticky='ns')
        xsb.grid(row=1, column=0, sticky='ew')
        self.grid()

root = tk.Tk()
path_to_my_project = os.getcwd()
app = App(root, path=path_to_my_project)
app.mainloop()

Home-icon_16.gif:

image python-3.x tkinter ttk treeviewitem
1个回答
0
投票

您可能不再需要这个,但对于其他人来说,这就是我的管理方式。

import tkinter as tk
from tkinter import ttk

window = tk.Tk()

window.eval("""
# Load the path of the images
variable directory

# Use if images are in the same directory as the program:
set directory [file dirname [info script]]

# Use if images are in a different directory to the program:
# set directory [file join [file dirname [info script]] <Directory Name>]

variable images
# Load the images
# Image names are the filenames of the image files without the extension (e.g., image.png --> image)
foreach file [glob -directory $directory *.png] {
    set img [file tail [file rootname $file]]
    set images($img) [image create photo -file $file -format png]
}

# Create a new indicator element
ttk::style element create Custom.Treeitem.indicator \
    image [list $images(<Collapsed Node Image Name>) user2 $images(<Empty Image>) user1 $images(<Expanded Node Image Name>)] \
    -width <Image Size> -sticky n
""")

style = ttk.Style()

# Add the newly created indicator element to the layout of 'Custom.Treeview.Item'
style.layout('Custom.Treeview.Item', [('Treeitem.padding', {'sticky': 'nswe', 'children': [('Custom.Treeitem.indicator', {'side': 'left', 'sticky': ''}), ('Treeitem.image', {'side': 'left', 'sticky': ''}), ('Treeitem.text', {'sticky': 'nswe'})]})])

## Create a new treeview with the style 'Custom.Treeview'
tree = ttk.Treeview(window, style='Custom.Treeview')
tree.grid(row=0, column=0, sticky='NSWE')

window.mainloop()

不幸的是,这种方法意味着所有节点箭头都具有相同的图像,但它可能仍然有帮助。

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