2016-05-04 6 views
2

Ich habe an einer einfachen Tkinter-Leinwand gearbeitet, um ein Bild mit create_image anzuzeigen. Ich habe viele Threads gelesen, die sagen, dass Sie einen Verweis auf das Objekt außerhalb jeder Funktion oder Klasse erstellen müssen, andernfalls wird das Bildobjekt als Garbage Collected erfasst. Leider kann ich das immer noch nicht zur Arbeit bringen. Unten ist mein Code, wie er steht. Ignoriere alle Farben - ich verwende sie, um zu zeigen, wo die Rahmen und die Leinwand auf dem Fenster leben.Tkinter create_image

-Kirk

import Tkinter as tk 
from PIL import Image 
from PIL import ImageTk 

imageList = [] 
image = Image.open('len_std.jpg') 

#event handlers 
def hit_sel_click(): 
    imageList = [] 
    test_image = ImageTk.PhotoImage(image) 
    imageList.append(cnv_hits.create_image(0,0, 
       image=test_image))  

#start root 
root = tk.Tk() 
root.title('SimView') 
root.resizable(width=False, height=False) 

#target/control variables 
hit_sel = tk.StringVar() #holds radio button with activity level 

#build GUI 
frm_hits = tk.Frame(root, height=800, width=200, bg='#FF0000') 
frm_hits.grid(rowspan=3, sticky=tk.W+tk.N+tk.S+tk.E) 

tk.Label(frm_hits, text='Activity:').grid() 
tk.Radiobutton(frm_hits, text='Low', variable=hit_sel, value='Low', 
       command=hit_sel_click).grid(sticky=tk.W) 
tk.Radiobutton(frm_hits, text='Medium', variable=hit_sel, value='Medium', 
       command=hit_sel_click).grid(sticky=tk.W) 
tmp = tk.Radiobutton(frm_hits, text='High', variable=hit_sel,value='High', 
       command=hit_sel_click) 
tmp.grid(sticky=tk.W) 
tmp.select() 

frm_hit_list = tk.Frame(frm_hits, bg='#002288') 
frm_hit_list.grid(sticky=tk.W+tk.N+tk.E+tk.S) 

scrl_hits = tk.Scrollbar(frm_hit_list, orient=tk.VERTICAL) 
scrl_hits.grid(row=0, column=1, sticky=tk.N+tk.S) 

cnv_hits = tk.Canvas(frm_hit_list, bg='#888800',width=200, height=200, 
        yscrollcommand=scrl_hits.set) 
cnv_hits.grid(row=0, column=0, sticky=tk.W+tk.N+tk.E+tk.S) 

scrl_hits.config(command=cnv_hits.yview) 

root.mainloop() 

Antwort

4

Sie test_image werden mit dem Bild von cnv_hits zu ziehen. Das ist richtig, aber Sie haben vergessen, dass test_image lokal zu hit_sel_click() Methode ist; welches Ding bedeutet, dass es für Ihr Hauptprogramm nicht verfügbar ist.

Um dies zu beheben, haben Sie die Wahl zwischen 2:

  • Entweder test_image als global innerhalb hit_sel_click()
  • erklären oder test_image = ImageTk.PhotoImage(image) ausführen, bevor Sie hit_sel_click() erklären.

Nota Bene:

  • Für den ersten Fall, müssen Sie root = tk.Tk() vor hit_sel_click() laufen.

  • Falls Sie die zweite Option wählen, müssen Sie root = tk.Tk() vor test_image = ImageTk.PhotoImage(image)

Wenn Sie dies nicht tun laufen, wird Ihr Programm eine RuntimeError Ausnahme ausgelöst.

+1

Danke! Ich habe einen Verweis auf die falsche Variable erstellt. Keine späte Nacht mehr für mich. 8^D – KirkDCO