TclError: image "pyimage*" doesn't exist

Fragen zu Tkinter.
Antworten
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

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
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
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.
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

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
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

Danke wuf
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
Antworten