Tkinter: Button-Click soll Bild displayen

Fragen zu Tkinter.
Antworten
okapirider
User
Beiträge: 8
Registriert: Samstag 9. Januar 2021, 14:27

Hallo zusammen,

absoluter Python-Neuling hier. Ich versuche eine kleine App zu programmieren und komme bei einigen Sachen nicht weiter. Meine App soll folgendermaßen funktionieren:

Es sollen 10 Buttons existieren, klickt man einen der beliebigen Button an, soll ein Bild erscheinen (unterschiedliche Bilder für die Buttons von 0-9). Zusätzlich (das ist die nächste "Ausbaustufe") soll die App die Funktionalität haben, dass eine bestimmte Reihenfolge von Button Clicks wiederum ein anderes Bild darstellt (also z.B. sollen die Klicks auf die Buttons 0-4-7-8 ein Bild darstellen, die Klicks auf 2-4-5-9 wiederum ein anderes).

Ich bin noch recht am Anfang des Prozesses, scheitere allerdings schon daran überhaupt einen Tkinter Button mit einem Bild zu verknüfen. Hier mein bisheriger Code:

Code: Alles auswählen

import tkinter as tk
    

def write_slogan():
    print("Tkinter is easy to use!")

root = tk.Tk()
frame = tk.Frame(root)
frame.pack()

button = tk.Button(frame, 
                   text="QUIT", 
                   fg="red",
                   command=quit)
button.pack(side=tk.LEFT)
slogan = tk.Button(frame,
                   text="Hello",
                   command=write_slogan)
slogan.pack(side=tk.LEFT)

root.mainloop()
Nun find ich nicht so richtig welcher Command verwendet werden muss, damit ein Bild dargestellt wird und nicht in etwa der Slogan erscheint. Wie setze ich das am besten um?
Benutzeravatar
__blackjack__
User
Beiträge: 14084
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@okapirider: Ich würde vorher Python-Grundlagen lernen empfehlen. Für jede nicht-triviale GUI braucht man objektorientierte Programmierung (OOP), also selbst Klassen schreiben. Und Voraussetzung dafür sind Funktionen. Der gezeigte Quelltext hat beispielsweise Code auf Modulebene der da nicht hingehört, sondern auch in eine Funktion.

`functools.partial()` solltest Du Dir auch anschauen, denn wenn man 10 Buttons hat, die im Grunde das gleiche, nur mit anderen Parametern, macht, dann muss man diese Parametrisierung ja irgendwie machen ohne 10 ”verschiedene” Funktionen oder Methoden schreiben zu müssen.

Bilder kann man in einem `Label` anzeigen. Dabei gibt es eine Besonderheit die an Tk/Python liegt: man muss auf der Python-Seite unbedingt eine Referenz auf das angezeigte Bild behalten, denn Python kann nicht herausfinden ob das Bild auf Tk/Tcl-Seite noch irgendwo verwendet wird, das heisst wenn man in Python keinen Weg mehr hat mindestens theoretisch an das `PhotoImage`-Objekt heran zu kommen, dann räumt die Python-Laufzeitumgebung das Objekt einfach ab und gibt den Speicher mit den Bilddaten frei, wodurch es in Tk nicht mehr angezeigt wird. Ist ein beliebter Fallstrick über den wohl jeder schon mal gestolpert ist.

`quit()` als `command` gibt es so eigentlich gar nicht. Da meintest Du wahrscheinlich `root.quit`.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten