2017-11-18 11 views
2

ttk Treeviewに画像を追加するにはどうすればよいですか?コード例:Tkinter 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=()イメージを追加できません。何も表示されません。

EDIT:ソリューションのおかげではなく、複数の画像のdoesntの仕事:@Naeと@furasが指摘したと同様の機能が終了し、あなたのイメージは、ガベージコレクションを取得するとき

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() 
+0

[この](https://stackoverflow.com:複数の画像について、あなたはリストを作成する必要があります/ questions/37549976/tkinter-ttk-treeview-root-node-icon-image-does-not-appear)が役立ちます。 – Nae

+0

イメージをロードするコードが表示されません。それを示す。 PIL/Pillowを使用している場合は、http://effbot.org/tkinterbook/photoimage.htmの枕とガベージコレクターの問題に関するノートを読んでください。 – furas

+0

@Naeは試しましたが、何も起こりません。 –

答えて

2

、ローカル変数が削除されます。

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 = ...

EDITを呼び出すことができます。

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'])) 
+0

EDIT:それ以上のエントリでは機能しません。 _ Iの範囲内(0、(DB)LEN)のための:=イメージ tv._image = Image.open(DB [i]は[ "ピック"]) tv._image.thumbnail tv._image(( 100,200)、PIL.Image.ANTIALIAS) tv._image = ImageTk.PhotoImage(tv._image) tv.insert( ''、 'end'、image = tv._image、values =(db [i] [ '名前']、db [i] ['LName'])) tv.pack()_ –

+0

もっと多くの画像の回答が更新されました。 –

+0

質問は、最初の列 '#0'の一部ではなく、値として' Image'を使うことに関するものでした。 – buhtz

関連する問題