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
Aus tkinter window weiters window öffnen mit bildern
-
- User
- Beiträge: 13
- Registriert: Sonntag 8. September 2019, 15:35
Hier noch ein wenig Code:
Ich rufe das zweite Fenster, in dem das Bild dargestellt werden soll, als Funktion auf.
Mit print erhalte ich das richtige Bild, sobald der Interpreter aber eine Zeile weiterspringt, scheint das Bild schon wieder gelöscht
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)
- __blackjack__
- User
- Beiträge: 14087
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@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:
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.
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)
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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari