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

标签 python tkinter ttk

如何将图片添加到ttk Treeview?示例代码:

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 中,因为它是一个值。在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()

最佳答案

就像 @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']))

关于python - 如何将图片作为值添加到 Tkinter Treeview 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47369912/

相关文章:

python-3.x - 如何通过entry.get()变量从SQL检索数据

python-3.x - Tkinter - 了解如何切换帧

python - ttk:条目小部件禁用背景颜色

python - Robot Framework 中的 SSHLibrary 在 Mac 上因超时参数而失败

python - 如何删除python中只包含数字的单词?

python - 设置 URL gif 背景但不使用 Python 2 上的新框架

python - 我可以在 Windows 下更改 python ttk 组合框的颜色吗?

Python ttk 按钮。将参数传递给 OnClick

python - 具有条件彩色单元格的 Bokeh DataTable

Python:在哪里放置logging.getLogger