TclError: image "pyimage1" doesn't exist

Fragen zu Tkinter.
nevergod
User
Beiträge: 46
Registriert: Mittwoch 22. September 2010, 13:22

soweit so gut, jetzt kommt wieder pymage1 does not exist -.-

Code: Alles auswählen

   def lagerwin():
                lager=tk.Tk()
                descript=tk.Label(lager,text="""Wilkommen in deinem Lager! Hier siehst du was du gerade da hasst. Denke daran nicht
                alles selber zu konsumieren!!!""")
                space=tk.Label(lager,text="")
                space2=tk.Label(lager,text="")
                space3=tk.Label(lager,text="")
                space4=tk.Label(lager,text="")
                space5=tk.Label(lager,text="")
                space6=tk.Label(lager,text="")
                def pil_to_tk(pil_image):
                    tk_image = ImageTk.PhotoImage("RGBA", pil_image.size)
                    tk_image.paste(pil_image)
                    return tk_image

                img = Image.open("bin/img/lolliava.gif")
                photo = pil_to_tk(img)
                                 
                lolliimglab=tk.Label(lager, image=photo)
                lollinamelab=tk.Label(lager,text="Lollipop´s : ")
                x=open("bin/account/9.txt",'r')
                lollisread=x.readline()
                lollis=int(lollisread)
                x.close()
                lolliamountlab=tk.Label(lager,text="%s gramm" % lollis)
                
                descript.grid(columnspan=3)
                space.grid(row=2)
                lolliimglab.grid(row=3,column=1)
                lollinamelab.grid(row=3,column=2)
                lolliamountlab.grid(row=3,column=3)
                

verzweifle gleich.

gruß,
nevergod
BlackJack

@nevergod: Es ist immer noch das gleiche Problem: Du musst solange das Bild dargestellt werden soll, eine Referenz darauf behalten. Du bindest das an den Namen `photo`. Der Name ist aber lokal zur `lagerwin()`-Funktion. Wenn die abgearbeitet wurde, verschwindet der Name `photo` und damit wird der Speicher für das Bild freigegeben.

Ansonsten solltest Du dringend diese ganzen Quelltextwiederholungen durch Schleifen ersetzen und aufhören nichtssagende und durchnummerierte Namen zu verwenden.
nevergod
User
Beiträge: 46
Registriert: Mittwoch 22. September 2010, 13:22

wie soll ich denn eine referenz behalten..
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo nevergod

Probier einmal mit:

Code: Alles auswählen

root.photo = pil_to_tk(img)
lolliimglab=tk.Label(lager, image=root.photo)
Gruß wuf :wink:
Take it easy Mates!
BlackJack

@nevergod: Üblicherweise bindet man das Bild an das Objekt von der Methode in der es erstellt wurde -- da Du das ganze mit verschachtelten Funktionen löst geht das natürlich so nicht.
nevergod
User
Beiträge: 46
Registriert: Mittwoch 22. September 2010, 13:22

@wuf, danke für deine mühe, hat sich aber leider nix an der fehlermeldung geändert
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Code: Alles auswählen

import Tkinter as tk
import Image
import ImageTk

def lagerwin(lager, photo):
    descript=tk.Label(lager,text="""Wilkommen in deinem Lager! Hier siehst du was du gerade da hast. Denke daran nicht
    alles selber zu konsumieren!!!""")
    space=tk.Label(lager,text="")
    space2=tk.Label(lager,text="")
    space3=tk.Label(lager,text="")
    space4=tk.Label(lager,text="")
    space5=tk.Label(lager,text="") 
    space6=tk.Label(lager,text="")
   
    lolliimglab=tk.Label(lager, image=photo)
    lollinamelab=tk.Label(lager,text="Lollipop´s : ")
    x=open("bin/account/9.txt",'r')
    lollisread=x.readline()
    lollis=int(lollisread)
    x.close()
    lolliamountlab=tk.Label(lager,text="%s gramm" % lollis)
   
    descript.grid(columnspan=3)
    space.grid(row=2)
    lolliimglab.grid(row=3,column=1)
    lollinamelab.grid(row=3,column=2)
    lolliamountlab.grid(row=3,column=3)
    
if __name__ == "__main__":

    def pil_to_tk(pil_image):
        tk_image = ImageTk.PhotoImage("RGBA", pil_image.size)
        tk_image.paste(pil_image)
        return tk_image

    img = Image.open("bin/img/lolliava.gif")
    photo = pil_to_tk(img)
    
    root = tk.Tk()
    
    lagerwin(root, photo)
So sollte es gehen. (Vorsicht ungetestet).

btw. kennst du eigentlich den unterschied zwischen lokalen und globalen variablen.
Bzw. was hier vorallem wichtig ist, die Gültigkeitsbereiche einer variable ?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo nevergod

Hier noch etwas zum ausprobieren:

Code: Alles auswählen

def lagerwin():
    lager = tk.Toplevel() #Tk()

Code: Alles auswählen

#photo = pil_to_tk(img)
lager.photo = pil_to_tk(img)

#lolliimglab=tk.Label(lager, image=photo)
lolliimglab = tk.Label(lager, image=lager.photo)
Gruß wuf :wink:
Take it easy Mates!
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo nevergod

Als nächstes würde ich alle:

Code: Alles auswählen

tk.Tk()
mit Ausnahme von:

Code: Alles auswählen

root = tk.Tk()
ersetzen durch:

Code: Alles auswählen

tk.Toplevel()
Bei deinem Skript hatte es noch einige Labels bei denen das vorgesetzte tk. fehlte. Nehme aber an du hast dies schon herausgefunden und korrigiert.

Gruß wuf :wink:
Take it easy Mates!
Antworten