TclError: image "pyimage1" doesn't exist

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

ja hab from tkinter import * eingegeben. Ist das schlimm? Wie kann ich das anders eingeben? :S

gruß,
nevergod
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

eigentlich sollte man module immer mit "import modul" öffnen also in deinem Fall zB.

Code: Alles auswählen

import Tkinter as tk
so würdest du alle Klassenobjekte die du aus dem tkinter-Modul benötigst über tk aufrufen, also statt Button(...) - tk.Button(...).
So kann kein Konflikt auftreten, wenn Klassenobjekte mit gleiche mNamen in den Modulen, die du importierst hast, existieren.
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

nevergod hat geschrieben:habs jetzt soweit hinbekommen. Denn es kommt jetzt ein anderer fehler ^^couldnt recognize image data!
Kannst du es einmal mit einem anderen .gif-Bildchen probieren, welches du nicht selber erstell hast?

Gruß wuf :wink:
Take it easy Mates!
nevergod
User
Beiträge: 46
Registriert: Mittwoch 22. September 2010, 13:22

habs mit der as tk methode versucht, also vor jedes labl button Tk etc ein tk. gesetzt und as tk importiert.

jetzt kommt da "Exception in Tkinter callback" wenn ich das hauptfenster lade. Ich poste mal den gesammten code. (Soll eine art Browsergame im gui werden.)

Code: Alles auswählen

# -*- coding: cp1252 -*-
import Tkinter
import Image
import ImageTk



    
# INTRO_________
import Tkinter as tk

root=tk.Tk()
lab1=tk.Label(root,text="Wilkommen zu Crackgame!!! Dein Dealergame im GUI!!")
lab1.pack()
def newgame():
    newfenster=tk.Tk()
    lab1=tk.Label(newfenster,text="""Bitte den neuen Spielernamen eingeben.
               Alte Spielstände werden überschrieben!""")
    ent1=tk.Entry(newfenster)
    def makeacc():
        accname = ent1.get()
        writefile = open("bin/account/1.txt",'w')
        writefile.close()
        x = open("bin/account/1.txt",'w')
        x.write("%s" % accname)
        x.close()
        writefile = open("bin/account/2.txt",'w')
        writefile.close()
        x = open("bin/account/2.txt",'w')
        x.write("500")
        x.close()
        writefile = open("bin/account/3.txt",'w')
        writefile.close()
        x = open("bin/account/3.txt",'w')
        x.write("1")
        x.close()
        writefile = open("bin/account/4.txt",'w')
        writefile.close()
        x = open("bin/account/4.txt",'w')
        x.write("0")
        x.close()
        writefile = open("bin/account/5.txt",'w')
        writefile.close()
        x = open("bin/account/5.txt",'w')
        x.write("0")
        x.close()
        writefile = open("bin/account/6.txt",'w')
        writefile.close()
        x = open("bin/account/6.txt",'w')
        x.write("0")
        x.close()
        writefile = open("bin/account/7.txt",'w')
        writefile.close()
        x = open("bin/account/7.txt",'w')
        x.write("0")
        x.close()
        writefile = open("bin/account/8.txt",'w')
        writefile.close()
        x = open("bin/account/8.txt",'w')
        x.write("0")
        x.close()
        writefile = open("bin/account/9.txt",'w')
        writefile.close()
        x = open("bin/account/9.txt",'w')
        x.write("0")
        x.close()
        writefile = open("bin/account/10.txt",'w')
        writefile.close()
        x = open("bin/account/10.txt",'w')
        x.write("0")
        x.close()
        writefile = open("bin/account/11.txt",'w')
        writefile.close()
        x = open("bin/account/11.txt",'w')
        x.write("0")
        x.close()
        writefile = open("bin/account/12.txt",'w')
        writefile.close()
        x = open("bin/account/12.txt",'w')
        x.write("0")
        x.close()
        writefile = open("bin/account/13.txt",'w')
        writefile.close()
        x = open("bin/account/13.txt",'w')
        x.write("0")
        x.close()
        writefile = open("bin/account/14.txt",'w')
        writefile.close()
        x = open("bin/account/14.txt",'w')
        x.write("0")
        x.close()
        x = open("bin/account/15.txt",'w')
        x.write("0")
        x.close()
        erfolg=Tk()
        lab1=tk.Label(erfolg,text="Erfolg! Bitte mit Spiel fortsetzen losspielen!")
        lab1.pack()
        but1=tk.Button(erfolg,text="OK",command=erfolg.destroy)
        but1.pack()
        
    okbut=tk.Button(newfenster,text="OK",command=makeacc)
    close=tk.Button(newfenster,text="Abbrechen",command=newfenster.destroy)
    lab1.pack()
    ent1.pack()
    okbut.pack()
    close.pack()
newgame=tk.Button(root,text="Neues Spiel",command=newgame)
def contin():
    fort=tk.Tk()
    lab1=tk.Label(fort,text="Sicherheitsmaßnahme: Bitte geben sie hier ihre ID ein.")
    lab1.grid(columnspan=2)
    identify=tk.Entry(fort)
#HAUPTSPIELFENSTER________________
    def GAME():
        stat=open("bin/account/1.txt",'r')
        eingabe=identify.get()
        name=stat.readline()
        
        if name==eingabe:
            main=tk.Tk()
            space=tk.Label(main,text="")
            wmessage=tk.Label(main,text="""Wilkommen zu "Crackgame" dem Python-Dealergame by NeverGod   """)
            anfertigenbutton=tk.Button(main,text="Drogen herstellen",height=2,width=16)
            verkaufenbutton=tk.Button(main,text="Drogen verkaufen",height=2,width=16)
            gebietebutton=tk.Button(main,text="Gebiete beziehen",height=2,width=16)
            skills=tk.Button(main,text="Skillpunkte vergeben",height=2,width=16)
            veranstaltungen=tk.Button(main,text="Veranstaltungen",height=2,width=16)
            gebaudebutton=tk.Button(main,text="Gebäude",height=2,width=16)
            #LAGERBESTAND_________________
            def lagerwin():
                lager=tk.Tk()
                descript=Label(lager,text="""Wilkommen in deinem Lager! Hier siehst du was du gerade da hasst. Denke daran nicht
                alles selber zu konsumieren!!!""")
                space=Label(lager,text="")
                space2=Label(lager,text="")
                space3=Label(lager,text="")
                space4=Label(lager,text="")
                space5=Label(lager,text="")
                space6=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)
                


                
                
            
            lagerbutton=tk.Button(main,text="Lagerbestand",height=2,width=16,command=lagerwin)
            namelabel=tk.Label(main,text="Name : ")
            def namestat():
                x=open("bin/account/1.txt",'r')
                namestat=x.readline()
                x.close()
            namelabel1=tk.Label(main,text="%s" % namestat)
            def update_name():
                x=open("bin/account/1.txt",'r')
                namestat=x.readline()
                x.close()
                namelabel1.config(text=namestat)
                namelabel1.after(1000,update_name)
                def namestat():
                    x=open("bin/account/1.txt",'r')
                    namestat=x.readline()
                    x.close()              
            namelabel1.after(1000,update_name)

            x=open("bin/account/2.txt",'r')
            geldread=x.readline()
            geld=int(geldread)
            x.close()
            geldlab=Label(main,text="Geld : ")
            geldlabel=Label(main,text="%s $" % geld)
            def update_geld():
                x=open("bin/account/2.txt",'r')
                geldread=x.readline()
                geld=int(geldread)
                x.close()
                geldlabel.config(text="%s $" % geld)
                geldlabel.after(1000,update_geld)
            geldlabel.after(1000,update_geld)

            levellabel=tk.Label(main,text="Level : ")
            def level():
                x=open("bin/account/3.txt",'r')
                levelread=x.readline()
                level=int(levelread)
                x.close()
            levellabel1=tk.Label(main,text=level)
            def update_level():
                x=open("bin/account/3.txt",'r')
                levelread=x.readline()
                level=int(levelread)
                x.close()
                levellabel1.config(text=level)
                levellabel1.after(1000,update_level)
            levellabel1.after(1000,update_level)

            explabel=tk.Label(main,text="EXP : ")
            def exp():
                x=open("bin/account/4.txt",'r')
                expread=x.readline()
                exp=int(expread)
                x.close()
            explabel1=tk.Label(main,text=exp)
            def update_exp():
                x=open("bin/account/4.txt",'r')
                expread=x.readline()
                exp=int(expread)
                x.close()
                explabel1.config(text=exp)
                explabel1.after(1000,update_exp)
            explabel1.after(1000,update_exp)

            splabel=tk.Label(main,text="Skillpoints : ")
            def skillpoint():
                x=open("bin/account/5.txt",'r')
                skillpread=x.readline()
                skillpoint=int(skillpread)
                x.close()
            splabel1=tk.Label(main,text=skillpoint)
            def update_skillpoint():
                x=open("bin/account/5.txt",'r')
                skillpread=x.readline()
                skillpoint=int(skillpread)
                x.close()
                splabel1.config(text=skillpoint)
                splabel.after(1000,update_skillpoint)
            splabel1.after(1000,update_skillpoint)

            chemlevllab=tk.Label(main,text="Chemiker Skilllevel : ")
            def chemlvl():
                x=open("bin/account/6.txt",'r')
                chemlvlread=x.readline()
                chemlvl=int(chemlvlread)
                x.close()
            chemlevllab1=tk.Label(main,text=chemlvl)
            def update_chemlvl():
                x=open("bin/account/6.txt",'r')
                chemlvlread=x.readline()
                chemlvl=int(chemlvlread)
                x.close()
                chemlevllab1.config(text=chemlvl)
                chemlevllab1.after(1000,update_chemlvl)
            chemlevllab1.after(1000,update_chemlvl)
            werblevllab = tk.Label(main,text="Werbegenie Skilllevel : ")
            def werblvl():
                x=open("bin/account/7.txt",'r')
                werblvlread=x.readline()
                werblvl=int(werblvlread)
                x.close()
            werblevllab1 = tk.Label(main,text=werblvl)
            def update_werblvl():
                x=open("bin/account/7.txt",'r')
                werblvlread=x.readline()
                werblvl=int(werblvlread)
                x.close()
                werblevllab1.config(text=werblvl)
                werblevllab1.after(1000,update_werblvl)
            werblevllab1.after(1000,update_werblvl)
            verhlevllab = tk.Label(main,text="Verhandlngsgeschick Skilllevel : ")
            def verhlvl():
                x=open("bin/account/8.txt",'r')
                verhlvlread=x.readline
                verhlvl=int(verhlvlread)
                x.close()
            verhlevellab1=tk.Label(main,text=verhlvl)
            def update_verhlvl():
                x=open("bin/account/8.txt",'r')
                verhlvlread=x.readline()
                verhlvl=int(verhlvlread)
                x.close()
                verhlevellab1.config(text=verhlvl)
                verhlevellab1.after(1000,update_verhlvl)
            verhlevellab1.after(1000,update_verhlvl)

            ruhmlabel=tk.Label(main,text="Ruhm : ")
            def ruhm():
                x=open("bin/account/15.txt",'r')
                ruhmread=x.readline()
                ruhm=int(ruhmread)
                x.close()
            ruhmlabel1=tk.Label(main,text=ruhm)
            def update_ruhm():
                x=open("bin/account/15.txt",'r')
                ruhmread=x.readline()
                ruhm=int(ruhmread)
                x.close()
                ruhmlabel1.config(text=ruhm)
                ruhmlabel1.after(1000,update_ruhm)
            ruhmlabel1.after(1000,update_ruhm)
            space2=tk.Label(main,text="")
            space.grid()
            wmessage.grid(column=1,columnspan=3)
            anfertigenbutton.grid(row=2)
            verkaufenbutton.grid(row=4)
            gebietebutton.grid(row=6)
            skills.grid(row=8)
            veranstaltungen.grid(row=10)
            gebaudebutton.grid(row=12)
            lagerbutton.grid(row=14)
            namelabel.grid(row=3,column=2)
            namelabel1.grid(row=3,column=3)
            geldlab.grid(row=4,column=2)
            geldlabel.grid(row=4,column=3)
            levellabel.grid(row=5,column=2)
            levellabel1.grid(row=5,column=3)
            explabel.grid(row=6,column=2)
            explabel1.grid(row=6,column=3)
            splabel.grid(row=7,column=2)
            splabel1.grid(row=7,column=3)
            chemlevllab.grid(row=8,column=2)
            chemlevllab1.grid(row=8,column=3)
            werblevllab.grid(row=9,column=2)
            werblevllab1.grid(row=9,column=3)
            verhlevllab.grid(row=10,column=2)
            verhlevellab1.grid(row=10,column=3)
            ruhmlabel.grid(row=11,column=2)
            ruhmlabel1.grid(row=11,column=3)
            space.grid(row=13)
            
            
        else:
            noway=tk.Tk()
            label=tk.Label(noway,text="Falsche ID!!")
            button=tk.Button(noway,text="OK",command=noway.destroy)
            label.pack()
            button.pack()
#HAUPTSPIELFENSTER ENDE_______
        
    Identok=tk.Button(fort,text="Fortsetzen!",command=GAME)
    identify.grid(row=2,column=0)
    Identok.grid(row=2,column=1)
continuegame=tk.Button(root,text="Fortsetzen",command=contin)
close=tk.Button(root,text="Schließen",command=root.destroy)
newgame.pack()
continuegame.pack()
close.pack()
root.mainloop()
#INRO ENDE________
was mache ich falsch :S
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Weil du zweimal Tkinter lädst

Code: Alles auswählen

# -*- coding: cp1252 -*-
import Tkinter # <----- hier
import Image
import ImageTk

# INTRO_________
import Tkinter as tk # <----- und hier
du darfst das modul nur einmal laden.
Das "as" dient nur als zuweisung für einen anderen Namen zur Erreibarkeit des Moduls.
Nur um das Tkinter etwas kürzer zu machen, bei nur "import Tkinter", müsstest du immer Tkinter.Button(...) schreiben.

Das war nur da um es dir etwas leichter zumachen, das überall hinzuzufügen.
Also so wie es jetzt ist musst du einfach nur das "import Tkinter" oben raus nehmen.
Zuletzt geändert von Xynon1 am Donnerstag 14. Oktober 2010, 13:40, insgesamt 1-mal geändert.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
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