Seite 1 von 1

Bild in einem Toplevelfenster darstellen

Verfasst: Montag 15. Januar 2024, 19:40
von tomZ
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

Re: Bild in einem Toplevelfenster darstellen

Verfasst: Montag 15. Januar 2024, 20:51
von __deets__
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

Re: Bild in einem Toplevelfenster darstellen

Verfasst: Dienstag 16. Januar 2024, 18:08
von tomZ
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

Re: Bild in einem Toplevelfenster darstellen

Verfasst: Dienstag 16. Januar 2024, 19:26
von sparrow
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.

Re: Bild in einem Toplevelfenster darstellen

Verfasst: Mittwoch 17. Januar 2024, 19:51
von Sirius3
@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()

Re: Bild in einem Toplevelfenster darstellen

Verfasst: Samstag 17. Februar 2024, 16:44
von tomZ
Vielen Dank für die Antworten

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