Seite 1 von 1
Aus tkinter window weiters window öffnen mit bildern
Verfasst: Freitag 15. November 2019, 20:38
von turbosoeckchen
Hallo zusammen,
Ich stehe vor folgendem Problem:
Ich habe mit tkinter ein Window geöffnet, in dem bereits tk.Photoimages verwendet werden.
Jetzt möchte ich aus diesem Bild per Button ein weiteres Fenster öffnen - das funktioniert auch wunderbar, solange das weitere Fensterkein Photo/Bild enthält.
Möchte ich in dem weiteren Fenster jedoch ein Bild darstellen bekomme ich immer den Fehler dass pyimange1 nicht existiert.
(Die Bilder des Hauptfensters sind als .create_image von der Canvasklasse entstanden)
Wie kann ich das Problem lösen?
Vielen Dank für alle eure Hilfen!
Turbosoeckchen
Re: Aus tkinter window weiters window öffnen mit bildern
Verfasst: Freitag 15. November 2019, 21:58
von turbosoeckchen
Hier noch ein wenig Code:
Ich rufe das zweite Fenster, in dem das Bild dargestellt werden soll, als Funktion auf.
Code: Alles auswählen
if schwierigkeit == "einfach":
verbindungen = tk.PhotoImage(file=einfach_b)
print(verbindungen)
label = tk.Label(canvas2, image=verbindungen)
elif schwierigkeit == "mittel":
verbindungen = tk.PhotoImage(file=mittel_b)
print(verbindungen)
label = tk.Label(canvas2, image=verbindungen)
else:
verbindungen = tk.PhotoImage(file=schwer_b)
print(verbindungen)
label = tk.Label(canvas2, image=verbindungen)
Mit print erhalte ich das richtige Bild, sobald der Interpreter aber eine Zeile weiterspringt, scheint das Bild schon wieder gelöscht
Re: Aus tkinter window weiters window öffnen mit bildern
Verfasst: Freitag 15. November 2019, 23:50
von __blackjack__
@turbosoeckchen: Kryptische Abkürzungen und nummerierte Namen sind keine gute Idee. Auch Code-Wiederholungen sollte man sich sparen. Da steht ja im Grunde drei mal der gleiche Code in den Zweigen, der unterscheidet sich nur durch den jeweiligen Dateinamen. Das löst man am besten mit einem Wörterbuch das Schwierigkeiten auf Dateinamen abbildet:
Code: Alles auswählen
schwierigkeit_zu_bilddateiname = {
"einfach": einfach_bilddateiname,
"mittel": mittel_bilddateiname,
"schwer": schwer_bilddateiname,
}
verbindungen = tk.PhotoImage(
file=schwierigkeit_zu_bilddateiname[schwierigkeit]
)
print(verbindungen)
label = tk.Label(canvas, image=verbindungen)
Falls sich diese Zuordnung nicht ändert, kann man die auch als Konstante heraus ziehen.
Zum Problem: Ich vermute mal das `verbindungen` ein lokaler Name ist und damit verschwindet wenn die Funktion am Ende ist. Und damit wird dann auch das Bild aus dem speicher entfernt wenn auf Python-Seite keine Referenz mehr darauf besteht, weil Python nicht weiss, dass die Tk-Seite das noch verwendet. Du musst das Bildobjekt also an ein weiterhin bestehendes Objekt binden, das mindestens so lange existiert wie das Bild für die Anzeige benötigt wird.