【问题标题】:Image in treeview Tkinter library in PythonPython中treeview Tkinter库中的图像
【发布时间】:2018-05-13 18:12:17
【问题描述】:

我正在 Python tkinter 库中创建树视图。我想在代表文件的每个节点旁边都有一个图像图标。我已经创建了函数,但我不知道为什么图像只出现在最后一个节点中。

    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)])

如果下一个节点扩展则消失...

【问题讨论】:

    标签: python tkinter treeview


    【解决方案1】:

    我认为这与不保存对图像的引用有关。为每个文件创建一个新图像: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 来关联缩略图和文件。

    【讨论】:

    • 感谢您的回答!但我想为每个文件创建一个图像,因为每个文件中都有不同的图像。你只为一个图像准备了代码,它被添加到每个节点?
    • 更新了我的答案。
    猜你喜欢
    • 2019-05-25
    • 2018-03-12
    • 2018-08-24
    • 2023-04-04
    • 2021-02-02
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多