我在Python tkinter库中创建了treeview。我想在代表文件的每个节点旁边都有一个图像图标。我已经创建了函数,但我不知道为什么图像只出现在最后一个节点中。
def populate_tree(self, parent, fullpath, children):
for child in children:
cpath = os.path.join(fullpath, child).replace('\\', '/')
if os.path.isdir(cpath):
cid = self.tree.insert(parent, END, text=child,
values=[cpath, 'directory'])
self.tree.insert(cid, END, text='dummy')
else:
if (child != "Thumbs.db"):
self.pic = ImageTk.PhotoImage(file=cpath)
self.tree.insert(parent, END, text=child, image=self.pic,
values=[cpath, 'file','{} bajtów'.format(os.stat(cpath).st_size)])
如果下一个节点被扩展,则消失...
答案 0 :(得分:2)
我认为这与不保存对图像的引用有关。对于您创建新图像的每个文件:self.pic = ImageTk.PhotoImage(file=cpath)
我猜Python会创建一个新对象,并且表示先前图像的对象会被垃圾收集。
我做了一个例子,我在函数范围之外创建了图像,然后在创建树视图项时使用它们:
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
tree = ttk.Treeview(root)
tree.pack()
# Create a list of thumbnail images associated with filenmes
thumbnails = ['thumb1.png','thumb2.png','thumb3.png']
images = []
for thumb in thumbnails:
images.append(tk.PhotoImage(file=thumb))
def populate_tree():
folder = tree.insert('', 'end', text='Folder')
for i in range(3):
filename = 'Image_' + str(i)
tree.insert(folder, 'end', text=filename, image=images[i])
populate_tree()
在我的示例中,我使用缩略图列表使其变得简单。如果您有许多文件,则可能需要使用dict来关联缩略图和文件。