und schon wieder benötige ich euere Hilfe.
Dieses mal habe ich mir überlegt wie ich ein Programm angehen würde, wenn ich mit Buttons zwischen verschiedenen Seiten wechseln will. Dabei soll man auf den einzelnen Seiten Werte eingeben oder Radiobuttons auswählen. Mit diesen Informationen soll gerechnet werden und auf der letzten Seite soll das Ergebnis erscheinen.
Das wechseln der Seiten funktioniert sehr gut, dank dieser Vorlage:
https://stackoverflow.com/questions/754 ... in-tkinter
Daraus ist dann mal dieser Code entstanden:
Code: Alles auswählen
import tkinter as tk
from functools import partial
class CalculationApp(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.result = None
self.frames = {}
for page in (Home, Entry, Result):
page_name = page.__name__
frame = page(parent=self, controller=self)
frame.grid(row=0, column=0, sticky="nsew")
self.frames[page_name] = frame
self.show_page("Home")
def show_page(self, page_name):
self.frames[page_name].tkraise()
def get_page(self, classname):
for page in self.frames.values():
if str(page.__class__.__name__) == classname:
return page
return None
class Home(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
headline = tk.Label(self, text="Hier gehts zur Berechnung")
headline.grid(row=0, column=1)
go_to_entry_page = tk.Button(
self, text=">>", command=partial(self.controller.show_page, "Entry")
)
go_to_entry_page.grid(row=1, column=3)
class Entry(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.result = None
values_for_calculation = [10, 30]
description = tk.Label(self, text="Bitte Werte auswählen")
description.grid(row=0, column=1)
self.selected_button = tk.StringVar()
for row_index, value in enumerate(values_for_calculation, 1):
radio_button = tk.Radiobutton(
self, text=value, value=value, variable=self.selected_button
)
radio_button.grid(row=row_index, column=0)
tk.Button(
self, text="Berechne", command=self.calculate_something
).grid(row=3, column=3)
tk.Button(self, text="<<", command=partial(self.controller.show_page, "Home")).grid(
row=3, column=0
)
def calculate_something(self):
self.result = int(self.selected_button.get()) / 2
self.controller.show_page('Result')
class Result(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.show_result = tk.Label(self, text='')
self.show_result.grid(row=0, column=1)
button = tk.Button(
self, text="Startseite", command=partial(controller.show_page, "Home")
)
button.grid(row=1, column=1)
self.update_label()
def update_label(self):
self.show_result.config(text=self.controller.get_page('Entry').result)
def main():
root = tk.Tk()
root.title("Berechnungsprogramm")
app = CalculationApp(root)
app.pack()
app.mainloop()
if __name__ == "__main__":
main()
Dann habe ich noch ein Problem, es gefällt mir gar nicht, dass ich die Berechnung in einer Klasse mache, die eigentlich die grafische Oberfläche repräsentiert. Zu dem gefällt mir auch nicht, das ich in einer Funktion, die "calculate" im Name hat eine andere grafische Oberfläche aufrufe.
Wie würde man den so ein Programm richtig strukturieren?
Es kann ja auch gut sein, dass man zwischen den Seitenwechsel umfangreichere Berechnungen vornehmen muss und eventuell Daten aus Datenbanken abrufen. Das passt meiner Meinung nach nicht in eine von meinen Klassen. Das wäre ja das trenne nvon Grafik und Logik, wie man es immer wieder liest. Jetzt ist der Tag bald rum und bevor ich mich mal wieder komplett verrenne bin ich auf eure Antworten sehr gespannt.
Vielen Dank schon einmal!
Grüße
Dennis