Seite 1 von 1

PIL.ImageTk in einer Klasse aufrufen

Verfasst: Freitag 16. April 2010, 19:15
von Pascal
Hallo,

ich hoffe, der Titel beschreibt ungefähr das Thema.

So sieht mein Skript aus:


Code: Alles auswählen

import Tkinter as tk
from PIL import Image, ImageTk

class Test:

    def __init__(self, frame):
        
        self.canvas = tk.Canvas(frame, height=100, width=100)
        self.canvas.grid()

        self.bild_laden()


    def bild_laden(self):
        
        jpg = 'C:\users\pascal\\appdata\local\\temp\\tmps91imb.jpg'
        bild = Image.open(jpg)

        bild = ImageTk.PhotoImage(bild) 

        #print 'bild', bild
        #self.canvas.delete('all')
        self.canvas.create_image(50, 50, image=bild, tag = 'img') ## das bild ist nicht zu sehen
        #print self.canvas.find_withtag('img') # es wird ein element gefunden







win = tk.Tk()


test = Test(win)

canvas2 = tk.Canvas(win, width=100, height=100)
canvas2.grid()

jpg = 'c:\users\pascal\\appdata\local\\temp\\tmps91imb.jpg'

bild = Image.open(jpg)

bild = ImageTk.PhotoImage(bild) 

canvas2.create_image(50, 50,image=bild)  ## das bild wird angezeigt

        
win.mainloop()
Das Ergebnis ist, dass im Canvas2 das Bild angezeigt wird.
Im Canvas aus der Klasse Test jedoch nicht.
Der Unterschied besteht lediglich darin, dass einmal das Bild über eine Methode aufgerufen wird und im anderen Fall direkt erzeugt wird, oder seh ich das falsch ?

Wie kommt das zustande?

Re: PIL.ImageTk in einer Klasse aufrufen

Verfasst: Freitag 16. April 2010, 19:54
von numerix
Pascal hat geschrieben:Wie kommt das zustande?
Der Bezeichner bild in deiner Funktion bild_laden() ist ein lokaler Bezeichner, der beim Verlassen der Funktion verloren geht, der andere auf Modul-Ebene ist ein globaler. Deshalb funktioniert das zweite und das erste nicht. Du musst eine Referenz behalten, damit es klappt.
Wenn du in deiner Methode z.B. bild durch self.bild ersetzt, sollte es funktionieren.

Verfasst: Freitag 16. April 2010, 20:26
von Pascal
In der Tat.... du hast Recht

Mal dazu noch eine allgemeine Frage:

Erstelle ich dann im Konstruktor ein Attribut self.bild = None oder lasse ich es weg und schreibe es erst in der Methode?