如何将图片添加到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}}
答案 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']))