Seite 1 von 1

TclError: image "pyimage*" doesn't exist

Verfasst: Mittwoch 24. Oktober 2012, 11:22
von StefanLawl
Hallo, :mrgreen:

Ich möchte gerne 2 Fenster öffnen, und im 2. Fenster ein Hintergrundbild haben, was aber nicht funktioniert; Ich bekomme den Error von oben.
Google sagt mir ständig, ich hätte den falschen Pfad, aber der stimmt, da bin ich mir sicher.
Habe auch schon gelesen, dass es diverse Bugs bei ImageTk gibt, da kommt dir Frage, ob es Alternativen gibt, um einem Fenster einen Hintergrund zu geben. :K

Code: Alles auswählen

from Tkinter import *
from ImageTk import *

def main_stuff():
    global root, screen_width, screen_height, bgcolor
    root=Tk()
    screen_width = root.winfo_screenwidth()     # get screen size
    screen_height = root.winfo_screenheight()
    
    root.geometry("%dx%d" % (screen_width/2, screen_height/2))
    root.title("Pyro")

    App(root)
    root.mainloop()

class App():
    def __init__(self, master):
        self.frame_main = Frame(root, bg='black')
        self.frame_main.pack(fill='both', expand=True)
        self.frame_main.pack_propagate(0)
        self.newroot()
    
    def newroot(self):
        self.new_root = Tk()
        self.new_root.geometry("250x40")
        
        def window(self):
            self.mainframe=Frame(self.new_root, bg='yellow')
            self.mainframe.pack(fill='both', expand=True)
            
            self.imagefile=PhotoImage(file='buttonbackground.png')
            self.frame2=Label(self.mainframe, image=self.imagefile)
            self.frame2.image = self.imagefile
            self.frame2.pack(fill='both', expand=True)
        
        window(self)
        
        self.new_root.mainloop()

main_stuff()

Code: Alles auswählen

  File "C:\Python27\lib\lib-tk\Tkinter.py", line 2475, in __init__
    Widget.__init__(self, master, 'label', cnf, kw)
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1974, in __init__
    (widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: image "pyimage1" doesn't exist
Freue mich über Hilfe :)

Stefan

Re: TclError: image "pyimage*" doesn't exist

Verfasst: Mittwoch 24. Oktober 2012, 12:05
von BlackJack
@StefanLawl: Es darf immer nur ein `Tk`-Exemplar geben. Das ist das Hauptfenster und da hängt die Tk-Laufzeitumgebung dran. Wenn Du die zweimal startest, gibt es davon entweder zwei oder die erste wird mitten drin wieder neu initialisiert. In beiden Fällen gibt es Chaos. Zusätzliche Fenster erzeugt man mit `Tkinter.Toplevel`.

Die Sternchen-Importe solltest Du sein lassen. Damit kippst Du Dir von `Tkinter` ≈190 Namen in das Modul. Und an einen, nämlich `Image` kommst Du nach dem zweiten Import nicht mehr heran, weil das `ImageTk`-Modul ebenfalls ein `Image`-Attribut hat. Ausserdem sollte man `ImageTk` explizit auch dem `PIL`-Package importieren, denn die Module daraus werden irgendwann aus dem direkten Suchpfad verschwinden.

``global`` gehört auch nicht in ein sauberes Programm.

Die Definition von `window()` in `newroot()` erscheint mir sinnfrei. Den Quelltext hätte man auch direkt in die `newroot()` schreiben können.

Und eine zweite Hauptschleife sollte man auch nicht starten. Das geht zwar wenn man weiss was man tut, ist aber in der Regel unnötig.

Re: TclError: image "pyimage*" doesn't exist

Verfasst: Mittwoch 24. Oktober 2012, 12:48
von StefanLawl
Hallo BlackJack :mrgreen:
BlackJack hat geschrieben:@StefanLawl: Es darf immer nur ein `Tk`-Exemplar geben. Das ist das Hauptfenster und da hängt die Tk-Laufzeitumgebung dran. Wenn Du die zweimal startest, gibt es davon entweder zwei oder die erste wird mitten drin wieder neu initialisiert. In beiden Fällen gibt es Chaos. Zusätzliche Fenster erzeugt man mit `Tkinter.Toplevel`.
Vielen Dank für die ausführliche Antwort :)
Die Definition von `window()` in `newroot()` erscheint mir sinnfrei.
Ist mir auch im Nachhinein aufgefallen :P

Re: TclError: image "pyimage*" doesn't exist

Verfasst: Mittwoch 24. Oktober 2012, 13:02
von wuf
Hi StefanLawl

Hier etwas zum ausprobieren:

Code: Alles auswählen

import Tkinter as tk
from PIL import ImageTk

def main_stuff():
    global root, screen_width, screen_height, bgcolor
    app_win = tk.Tk()
    screen_width = app_win.winfo_screenwidth()     # get screen size
    screen_height = app_win.winfo_screenheight()
   
    app_win.geometry("%dx%d" % (screen_width/2, screen_height/2))
    app_win.title("Main window")
    app_win.update_idletasks()
    
    image_win = ImageWindow(app_win)
    
    app_win.mainloop()

class ImageWindow(tk.Toplevel):
    
    def __init__(self, master):
        
        tk.Toplevel.__init__(self)
        self.withdraw()
        self.lift(master)
        self.title("My image")
        self.geometry("+50+50")
        
        self.bg_image = ImageTk.PhotoImage(file='buttonbackground.png')
        tk.Label(self, image=self.bg_image).pack()
        
        self.update_idletasks()
        self.deiconify()

main_stuff()
Gruß wuf :wink:

Re: TclError: image "pyimage*" doesn't exist

Verfasst: Donnerstag 25. Oktober 2012, 15:21
von StefanLawl
Danke wuf