Aus tkinter window weiters window öffnen mit bildern

Fragen zu Tkinter.
Antworten
turbosoeckchen
User
Beiträge: 13
Registriert: Sonntag 8. September 2019, 15:35

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
turbosoeckchen
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.

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
Benutzeravatar
__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:

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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten