Seite 2 von 2

Re: TclError: image "pyimage1" doesn't exist

Verfasst: Donnerstag 14. Oktober 2010, 13:40
von nevergod
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

Re: TclError: image "pyimage1" doesn't exist

Verfasst: Donnerstag 14. Oktober 2010, 13:45
von 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.

Re: TclError: image "pyimage1" doesn't exist

Verfasst: Donnerstag 14. Oktober 2010, 14:38
von nevergod
wie soll ich denn eine referenz behalten..

Re: TclError: image "pyimage1" doesn't exist

Verfasst: Donnerstag 14. Oktober 2010, 14:47
von wuf
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:

Re: TclError: image "pyimage1" doesn't exist

Verfasst: Donnerstag 14. Oktober 2010, 14:56
von 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.

Re: TclError: image "pyimage1" doesn't exist

Verfasst: Donnerstag 14. Oktober 2010, 15:52
von nevergod
@wuf, danke für deine mühe, hat sich aber leider nix an der fehlermeldung geändert

Re: TclError: image "pyimage1" doesn't exist

Verfasst: Donnerstag 14. Oktober 2010, 16:43
von Xynon1

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 ?

Re: TclError: image "pyimage1" doesn't exist

Verfasst: Donnerstag 14. Oktober 2010, 17:07
von wuf
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:

Re: TclError: image "pyimage1" doesn't exist

Verfasst: Freitag 15. Oktober 2010, 14:05
von wuf
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: