Seite 1 von 2

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

Verfasst: Donnerstag 14. Oktober 2010, 11:52
von nevergod
ja hab from tkinter import * eingegeben. Ist das schlimm? Wie kann ich das anders eingeben? :S

gruß,
nevergod

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

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

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

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

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

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

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

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

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: