Seite 1 von 1

Label in Tkinter in einer Funktion überschreiben

Verfasst: Mittwoch 14. Juli 2021, 12:50
von meisenheinrich
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

Re: Label in Tkinter in einer Funktion überschreiben

Verfasst: Mittwoch 14. Juli 2021, 14:03
von Sirius3
*-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()

Re: Label in Tkinter in einer Funktion überschreiben

Verfasst: Mittwoch 14. Juli 2021, 16:56
von meisenheinrich
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.

Re: Label in Tkinter in einer Funktion überschreiben

Verfasst: Mittwoch 14. Juli 2021, 19:27
von Sirius3
Na, das mußt Du programmieren, wie Du die anderen Buttons auch programmiert hast.

Re: Label in Tkinter in einer Funktion überschreiben

Verfasst: Mittwoch 14. Juli 2021, 19:53
von dirk009
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.