Bild wird nicht in einer Funktion angezeigt

Fragen zu Tkinter.
Antworten
Linux-Fan
User
Beiträge: 8
Registriert: Samstag 30. Mai 2020, 15:03

Hallo,

ich möchte bei Tkinter verschiedene Bilder einbinden. Ich arbeite mit Linux.

In der bei mainloop funktioniert die Einbindung.
Wenn ich jedoch den Button drücke und in "def abfrage" wechsle wird kein Bild mehr angezeigt.
Die Zeile wird jedoch entsprechend vergrößert, aber nur ohne Bild.

from tkinter import *
def abfrage():
img2 = PhotoImage(file="/Bild/Bild2.png")
lab2 = Label (fenster, image=img2, height=400)
lab2.grid(row=1, column=0)
return

fenster = Tk()
knopf1 = Button(fenster, text="Bild ändern", command=abfrage)
knopf1.grid(row=0, column=0)
img1 = PhotoImage(file="/Bild/Bild1.png")
lab1 = Label (fenster, image=img1, height=400)
lab1.grid(row=1, column=0)
fenster.mainloop()

Viele Dank im Voraus.
Kommt gut in das Jahr 2021.
Viele Grüße
Linux-Fan
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Benutze kein *-Importe, weil damit verschleiert wird, wo welcher Name herkommt.
Fenster-Elemente werden einmal beim Erstellen des Fensters erzeugt und nicht nachträglich noch welche hinzugefügt, vor allem dann nicht wenn man damit ein anderes Element überdeckt. Man ändert einfach den Inhalt dieses Labels.
Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen, bei Dir also `fenster`, zukünftig aber `lab1`.
Benutze keine Abkürzungen. Welches Labor ist den lab1? Warum hat knopf1 eine 1, obwohl es nur einen Knopf gibt? Variablennamen sollten aussagekräftig sein, was Nummern im Normalfall nicht sind.

Python braucht eine Referenz auf das PhotoImage-Element, damit sein Speicher nicht wieder freigegeben wird.

Code: Alles auswählen

import tkinter as tk
from functools import partial

def abfrage(label, image):
    label['image'] = image

def main():
    fenster = tk.Tk()
    image_bild1 = tk.PhotoImage(file="/Bild/Bild1.png") 
    image_bild2 = tk.PhotoImage(file="/Bild/Bild2.png") 
    image_label = tk.Label(fenster, image=image_bild1, height=400) 
    image_label.grid(row=1, column=0)
    knopf1 = tk.Button(fenster, text="Bild ändern", command=partial(abfrage, image_label, image_bild2))
    knopf1.grid(row=0, column=0)
    fenster.mainloop()

if __name__ == '__main__':
    main()
Linux-Fan
User
Beiträge: 8
Registriert: Samstag 30. Mai 2020, 15:03

Frohes neues Jahr.

Vielen Dank für die Antwort.
Da bin ich einen Schritt weiter gekommen.

Jetzt sind die Bilder in der def main() festgelegt.
Zukünftig würde ich dann noch gerne die Bilderauswahl vergrößern.
Z.B. durch eine Auswahl aus einer Sqlit-Datenbank. > Zwischenspeicherung des Pfads in einer Variablen. Wird die Auswahl dann auch in der Funktion main() vorgenommen? Eigentlich hatte ich mir vorgestellt, dass diese "Selektion" unter def abfrage erfolgt. Aber das scheint ja dann nicht zu funktionieren.

Wie kann ich an dieses "Problem" rangehen?
Vielen Dank für die Unterstützung.

Gruß
Linux-Fan
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Linux-Fan: Du musst in Python eine Referenz auf das `PhotoImage`-Objekt behalten. Jede nicht-triviale GUI erfordert objektorientierte Programmierung, also mindestens eine eigene Klasse. Da bindet man das `PhotoImage`-Objekt dann in der entsprechenden Methode einfach an `self` und das Problem ist gelöst.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten