2010-07-29 22 views
5

Quando eseguo il programma, l'immagine viene visualizzata ma l'immagine no.Impossibile visualizzare un'immagine in Tkinter

canvas = Canvas(frame, width = 128, height = 128, bg= 'white') 
    image_data = Image.open('NoArt.gif') 
    ppm_f = ImageTk.PhotoImage(image_data) 
    canvas.create_image(0, 0, image = ppm_f, anchor = NW) 
    canvas.pack(side=BOTTOM) 

tutte le idee ??

PS.

ho PIL ver 1.6, Python 2.6, e La versione di Tkinter che viene fornito con Python 2.6

risposta

8

Ok, ho capito. Apparentemente a causa del modo in cui il pitone si occupa dello smaltimento dei rifiuti, le immagini vengono semplicemente cancellate. È richiesto un riferimento all'immagine nell'ambito globale. Questo è il codice di lavoro alla fine ho finito per usare:

self.photo = PhotoImage(file="noart.ppm") 
    self.Artwork = Label(self.frame, image=self.photo) 
    self.Artwork.photo = self.photo 
    self.Artwork.pack() 

che self.Artwork.photo = self.photo è la parte importante. Assicura che l'immagine verrà mostrata.

1

se qualcun altro ha mai un problema simile, si può provare questa soluzione hardcoded:

import Image 
import Tkinter as tk 

def cleanhex(x): 
    return str(hex(x))[-2:] 

def renderimage(target,data,w,h): 
    canvas = tk.Canvas(target,width=w,height=h) 
    canvas.pack() 
    for x in range(w): 
     for y in range(h): 
      c = "#" + cleanhex(data[x,y][0]) + cleanhex(data[x,y][1]) + cleanhex(data[x,y][2]) 
      canvas.create_line(x,y,x+1,y+1,fill=c) 

im = Image.open("whatever.whatever") 
renderimage(root,im.load(),im.size[0],im.size[1]) 
+0

Puoi spiegare cosa stai facendo esattamente? –

+0

Caricamento di un'immagine e disegno pixel per pixel. Questo probabilmente non è qualcosa che dovresti usare nella pratica (ci sono altre funzioni più ottimizzate che esistono in Tkinter), ma funziona. –

0

Come menzionato nel this very answer e this more popular question & answer ed anche in effbot.page

Quando si aggiunge un PhotoImage o altro Oggetto immagine su un widget Tkinter, è necessario mantenere il proprio riferimento all'oggetto immagine. Se non lo fai, l'immagine non verrà sempre visualizzata.

Il problema è che l'interfaccia Tkinter/Tk non gestisce correttamente i riferimenti agli oggetti Immagine; il widget Tk manterrà un riferimento all'oggetto interno , ma Tkinter no. Quando il garbage collector di Python scarta l'oggetto Tkinter, Tkinter dice a Tk di rilasciare l'immagine. Ma poiché l'immagine è in uso da un widget, Tk non lo distrugge. Non completamente . Semplicemente azzera l'immagine, rendendola completamente trasparente ...

La soluzione è di fare in modo di mantenere un riferimento all'oggetto Tkinter ,

Ad esempio il image nel codice sotto won’t always show up, se non del tutto in quanto non è dichiarata in ambito globale:

import tkinter as tk 

root = tk.Tk() 

def show_image(): 
    img_label = tk.Label(root) 
    image = tk.PhotoImage(file="test.png") 
    img_label['image'] = image 

    img_label.pack() 


show_image() 
root.mainloop() 

mentre nell'esempio sotto img_label.image è dichiarato globalmente, come attributo attaccati alla nostra molto img_label in questo esempio, e will be shown:

import tkinter as tk 

root = tk.Tk() 

def show_image(): 
    img_label = tk.Label(root) 
    img_label.image = tk.PhotoImage(file="test.png") 
    img_label['image'] = img_label.image 

    img_label.pack() 


show_image() 
root.mainloop() 

È comunque ancora strano img_label non è dichiarata globalmente o. Un modo meno confusionario sarebbe aggiungere global image come prima riga allo show_image.