Изображение в древовидной библиотеке Tkinter в Python - PullRequest
0 голосов
/ 13 мая 2018

Я создаю дерево в библиотеке 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)])

enter image description here

И исчезнет, ​​если следующий узел будет расширен ...

enter image description here

1 Ответ

0 голосов
/ 13 мая 2018

Я думаю, что это связано с сохранением ссылок на изображения.для каждого файла вы создаете новое изображение: 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 для связывания миниатюр и файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...