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
Label in Tkinter in einer Funktion überschreiben
*-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:
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()
-
- 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.
Hallo @meisenheinrich,
hier ein Vorschlag, der ein weiteres Fenster erzeugt und fragt:
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.
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()
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.