PIL.ImageTk in einer Klasse aufrufen

Fragen zu Tkinter.
Antworten
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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?
Antworten