Bild in einem Toplevelfenster darstellen

Fragen zu Tkinter.
Antworten
tomZ
User
Beiträge: 9
Registriert: Samstag 16. September 2023, 20:16

Guten Abend,

ich will ein Toplevelfenster erstellen das nur ein Bild darstellt - was nicht funktioniert.

Im Mainfenster wird auch ein Bild dargestellt und damit gibt es keine Probleme, ich will aber Toplevelfenster für Hilfetexte einbauen...

Das Toplevelfenster öffnet zwar (ohne Fehlermeldung) und hat genau die Größe des Bilder ( bild.png), aber das Bild ist nicht zu sehen.
Die Darstellung von Text funktioniert ( auskommentierte Zeile )

Code: Alles auswählen

import tkinter as tk
...
def open_window():
        top = tk.Toplevel(fenster)
        
        bildrahmen = tk.Frame(top)
        bildrahmen.pack()
        bild = tk.PhotoImage(file = '/.../bild.png')         # / .../ ist hier ein Platzhalter, aber der Pfad stimmt
        #label = tk.Label(bildrahmen, text = "hallo welt\nund noch eine Zeile")
        label = tk.Label(bildrahmen, image = bild)
        label.pack()
       
Kann da jemand helfen und mir sagen was ich da falsch mache ?

Viele Grüße
tom
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du verlierst die Referenz auf das Bild. Das wird garbage collected, und das war es. Du musst die aufheben. ZB durch schreiben einer Klasse & das Bild als Instanzattribut
tomZ
User
Beiträge: 9
Registriert: Samstag 16. September 2023, 20:16

Hallo,

ich habe das nun versucht mit einer Klasse zu lösen:

Code: Alles auswählen

class Hilfe(object):
        def __init__(self, bild):
            self.bild = bild
        def get(self):
            return(self.bild)
    
    
def open_window():
    top = tk.Toplevel(fenster)
    bildrahmen = tk.Frame(top)
    bildrahmen.pack()
        
    bild = tk.PhotoImage(file = '/ .../testumgebung/bild1.png')
    pic = Hilfe(bild)
    label = tk.Label(bildrahmen, image = pic.get())
        
    label.pack()
Das Ergebnis ist allerdings das selbe, ich bekomme keine Fehlermeldung, das Fenster geht auf und hat die Größe des Bildes, aber das Bild ist nicht zu sehen...

Was könnte ich noch versuchen ?

Viele Grüße
tom
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Das macht ja auch keinen Unterschied.
Wenn "bild" nicht mehr im Scope ist und abgeräumt wird, dann wird "pic" auch abgeräumt.

Du musst Klassen benutzen um deine GUI zu bauen.
Das musst du für jede nicht triviale Oberfläche sowieso.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@tomZ: die get-Methode ist überflüssig, weil man auch direkt auf `pic.bild` zugreifen könnte. Nun hast Du aber eine Klasse ohne Methoden und nur einem Attribut, also könntest Du ach direkt `bild` benutzen.
Eine sinnvolle Klasse wäre eine, die Bild und Fenster zusammenfasst:

Code: Alles auswählen

class ImageWindow(tk.Toplevel):
    def __init__(self, fenster, image_filename):
        super().__init__(fenster)
        self.image = tk.PhotoImage(file=image_filename)
        self.label = tk.Label(self, image=self.image)
        self.label.pack()
tomZ
User
Beiträge: 9
Registriert: Samstag 16. September 2023, 20:16

Vielen Dank für die Antworten

und speziell @Sirius3 ... ich denke damit kann ich was anfangen, Danke
Antworten