如何将图片作为值添加到Tkinter Treeview?

时间:2017-11-18 19:04:11

标签: python tkinter ttk

如何将图片添加到ttk from tkinter import * from ttk import * from tkinter import ttk import json from PIL import Image, ImageTk okno = Tk() def maketable(): style = ttk.Style(okno) style.configure("TVS.Treeview", rowheight=40) tv = Treeview(okno, style="TVS.Treeview") tv['columns'] = ('LName', 'Pic') tv.heading("#0", text='Jméno', anchor='w') tv.column("#0", anchor="w", width=200) tv.heading('LName', text='Příjmení') tv.column('LName', anchor='center', width=200) tv.heading('Pic', text='Obrazek') tv.column('Pic', anchor='center', width=200) dbf = open("xxx.json", 'r') db = json.loads(dbf.read()) for i in range(0, len(db)): root_pic1 = Image.open(db[i]["Pic"]) root_pic2 = ImageTk.PhotoImage(root_pic1) tv.insert('', 'end', image=root_pic2, text=db[i]['Name'], values=(db[i]['LName'])) tv.pack() def main(): okno.mainloop() if __name__ == '__main__': maketable() main() ?示例代码:

#0

我希望“Pic”列有图片 - 这意味着图片不应该在db[i]["Pic"]中,因为它是一个值。在values=()中有一个文件路径。在for i in range(0, len(db)): tv._image = Image tv._image = Image.open(db[i]["Pic"]) tv._image.thumbnail((100, 200), PIL.Image.ANTIALIAS) tv._image = ImageTk.PhotoImage(tv._image) tv.insert('', 'end', image=tv._image, values=(db[i]['Name'], db[i]['LName'])) tv.pack() 我无法添加图片 - 它没有显示任何内容。

编辑:感谢您提供解决方案,但对多张图片无效:

{{1}}

1 个答案:

答案 0 :(得分:2)

就像@Nae和@furas指出的那样,当函数完成并且你的图像被垃圾收集时,会删除局部变量。

你需要做类似的事情:

tv._image = Image.open('test.png')
tv._image = ImageTk.PhotoImage(tv._image)

for i in range(0, len(db)):

    tv.insert('', 'end', image=tv._image, text=db[i]['Name'], values=(db[i]['LName']))

或在函数外定义它们。如果你正在使用课程,那将是理想的,你可以致电self.root_pic = ...

编辑:对于更多图像,您需要创建一个列表:

tv._images = []    

for i in range(0, len(db)):
    image = Image.open(db[i]["Pic"])
    image = ImageTk.PhotoImage(image)
    image.thumbnail((100, 200), PIL.Image.ANTIALIAS) # resize
    tv._images.append(image)

    tv.insert('', 'end', image=tv._images[-1], text=db[i]['Name'], values=(db[i]['LName']))