Label in Tkinter in einer Funktion überschreiben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
meisenheinrich
User
Beiträge: 9
Registriert: Donnerstag 8. Juli 2021, 17:27

Grüßt euch,
ich würde gerne ein Programm programmieren, bei dem man aus verschiedenen Formen oder Körpern auswählen kann und dann bestimmte Werte eingibt mit denen dann bspw. der Flächeninhalt berechnet wird. Ich habe mich bereits ein wenig mit Tkinter auseinander gesetzt und habe nun das Problem, dass ich ein Label überschreiben möchte UND auf Knopfdruck die anderen Buttons löschen möchte. Derzeit sieht mein Code wie folgt aus:

from tkinter import *

root = Tk()
root.title("Geometrie Rechner")
e = Label(text="Wähle eine Form oder einen Körper aus")
e.grid(row=0, column=0, columnspan=3, padx=10, pady=10)


def button_click(form_1):
root.title("Viereck")
x
e = Label(text="Wähle ein Viereck aus")
y
return form_1


form_1 = Button(root, text="Viereck", padx=40, pady=20, command=lambda: button_click("Viereck"))
form_2 = Button(root, text="Dreieck", padx=40, pady=20, command=lambda: button_click("Dreieck"))
form_3 = Button(root, text="Kreis", padx=40, pady=20, command=lambda: button_click("Kreis"))
form_4 = Button(root, text="Würfel", padx=40, pady=20, command=lambda: button_click("Würfel"))
form_5 = Button(root, text="Quader", padx=40, pady=20, command=lambda: button_click("Quader"))
form_6 = Button(root, text="Kugel", padx=40, pady=20, command=lambda: button_click("Kugel"))
form_7 = Button(root, text="Zylinder", padx=40, pady=20, command=lambda: button_click("Zylinder"))
form_8 = Button(root, text="Pyramide", padx=40, pady=20, command=lambda: button_click("Pyramide"))
form_9 = Button(root, text="Kegel", padx=40, pady=20, command=lambda: button_click("Kegel"))

form_1.grid(row=1, column=0)
form_2.grid(row=1, column=1)
form_3.grid(row=1, column=2)
form_4.grid(row=2, column=0)
form_5.grid(row=2, column=1)
form_6.grid(row=2, column=2)
form_7.grid(row=3, column=0)
form_8.grid(row=3, column=1)
form_9.grid(row=3, column=2)

root.mainloop()

In die Zeile die ich mit x markiert habe müsste jetzt eine Funktion die das alte Label löscht (also "text="Wähle eine Form oder einen Körper aus").
Und die Zeile die ich mit y markiert habe müsste jetzt ein Befehl, der die anderen Buttons löscht, sodass man sozusagen das gleiche Fenster hat nur leer und mit Viereck als Überschrift.
Diese Funktion würde ich dann für jede Form bzw. Körper kopieren.
Ich hoffe, dass ich mich nicht allzu verwirrend ausgedrückt habe ^^
Vielleicht kann ja einer von euch helfen. Vielen Dank
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

*-Importe benutzt man nicht, weil man nicht nachvollziehen kann, woher welcher Name kommt. Tkinter wird üblicherweise über `import tkinter as tk` importiert.
Beim Label fehlt `root` als erster Parameter.
Alles was auf oberster Ebene steht und keine (Funktions-)definition ist, gehört auch in eine Funktion.
Statt Code zu kopieren benutzt man passende Datenstrukturen, z.B. hier eine Liste.
Statt das vorhandene Fenster zu verändern, würde ich eine neues Fenster aufmachen:

Code: Alles auswählen

import tkinter as tk
from functools import partial

FORMEN = ["Viereck", "Dreieck", "Kreis", "Würfel", "Quader", "Kugel", "Zylinder", "Pyramide", "Kegel"]

def button_click(root, form):
    window = tk.Toplevel(root)
    window.title(form)
    tk.Label(window, text=f"Wähle ein {form} aus:").pack()


def main():
    root = tk.Tk()
    root.title("Geometrie Rechner")
    e = tk.Label(root, text="Wähle eine Form oder einen Körper aus")
    e.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
    for index, form in enumerate(FORMEN):
        row, column = divmod(index, 3)
        button = tk.Button(root, text=form, padx=40, pady=20, command=partial(button_click, root, form))
        button.grid(row=row+1, column=column)
    root.mainloop()


if __name__ == "__main__":
    main()
meisenheinrich
User
Beiträge: 9
Registriert: Donnerstag 8. Juli 2021, 17:27

Alles klar, vielen Dank. Eine Frage hätte ich dann aber noch, und zwar frage ich mich, wie ich es schaffe, dass ich wenn zum Beispiel Viereck angeklickt wurde eine weitere Auswahl angezeigt wird. Sodass dann Viereck das Label des Fensters ist und ein Knopf mit z.B. Button(window, text="Rechteck").pack() oder Button(window, text="Quadrat").pack() erscheint.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Na, das mußt Du programmieren, wie Du die anderen Buttons auch programmiert hast.
dirk009
User
Beiträge: 27
Registriert: Donnerstag 3. Juni 2021, 21:49

Hallo @meisenheinrich,

hier ein Vorschlag, der ein weiteres Fenster erzeugt und fragt:

Code: Alles auswählen

import tkinter as tk
from functools import partial

FORMEN = ["Viereck", "Dreieck", "Kreis", "Würfel", "Quader", "Kugel", "Zylinder", "Pyramide", "Kegel"]


def button_click(root, form):
    if form == "Viereck":
        window = tk.Toplevel(root)
        window.title(form)
        label = tk.Label(window, text=f"Wähle ein {form} aus:")
        label.grid(row=0, column=0, padx=10, pady=10)
        button_rechteck = tk.Button(window, width=15, text="Rechteck", command=partial(button_click, window, "Rechteck"))
        button_rechteck.grid(row=1, column=0, padx=10, pady=10)
        button_quadrat = tk.Button(window, width=15, text="Quadrat", command=partial(button_click, window, "Quadrat"))
        button_quadrat.grid(row=2, column=0, padx=10, pady=10)
    elif form == "Rechteck":
        print(form)
        root.destroy()
    elif form == "Quadrat":
        print(form)
        root.destroy()
    else:
        window = tk.Toplevel(root)
        window.title(form)
        tk.Label(window, text=f"Wähle ein {form} aus:").pack()


def main():
    root = tk.Tk()
    root.title("Geometrie Rechner")
    e = tk.Label(root, text="Wähle eine Form oder einen Körper aus")
    e.grid(row=0, column=0, columnspan=3, padx=10, pady=10)
    for index, form in enumerate(FORMEN):
        row, column = divmod(index, 3)
        button = tk.Button(root, text=form, padx=40, pady=20, command=partial(button_click, root, form))
        button.grid(row=row+1, column=column)
    root.mainloop()
Cheers,
Dirk

PS: Falls dein Screenflow eigentlich ohne neue Windows arbeiteten soll,
dann kannst Du tk.Frame (https://www.geeksforgeeks.org/tkinter-a ... ge-frames/) verwenden.
Antworten