问题: 如何在 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()
您可能不再需要这个,但对于其他人来说,这就是我的管理方式。
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()
不幸的是,这种方法意味着所有节点箭头都具有相同的图像,但它可能仍然有帮助。