vllt kannst Du mir nochmal helfen. Ich habe jetzt ein kleines Programm gebastelt, welches funktioniert. Alles sehr einfach, aber zweckmäßig. Es sieht so aus, dass alle Gerichte auf einer Seite sind und ich diese per Checkbox auswählen kann und mir dann über einen Button die Einkaufsliste ausgegeben werden kann. Jetzt wollte ich die Gerichte noch unterteilen in bspw. Deutsch, Italienisch, Asiatisch usw.. Also auch diese Gerichte auf separate Seiten darstellen. Ich sende jetzt mal einen Teil des Codes. Die anderen Klassen wie "Italienisch", "Asiatisch" usw sind gleich aufgebaut wie "Deutsch". Meine Frage ist, wie muss ich die Funktion auf der Startseite definieren, dass ich die in auf Seiten, bspw Deutsche Seite, ausgewählten Gerichte erhalte? Das ist mir nicht ganz verständlich. Ich habe die betreffenden Zeilen im Code markiert.
Code: Alles auswählen
import tkinter as tk
from tkinter import ttk
from pathlib import Path
from collections import Counter
from PIL import Image, ImageTk
SELF_PATH = Path(__file__).parent
LARGEFONT =("Verdana", 35)
class meal():
def __init__(self, calories, meal_name, ingredient_list):
self.meal_name = meal_name
self.meal_image_name = str(meal_name) + '.png'
self.calories = calories
self.ingredient_list = ingredient_list
# Deutsch ---------------------------------------------------
Spaghetti = meal(550, 'Spaghetti', {
"Spaghetti [g]": 200,
"Tomatensosse [g]": 200,
'Tomatenmark [g]': 10,
'Basilikum [g]': 7.5,
'Knoblauch [Zh.]': 0.5,
"Zwiebeln [Stk.]": 0.5})
german_meals = [Spaghetti, Spaghetti]
# Asiatisch -------------------------------------------------
asian_meals = [Spaghetti, Spaghetti]
class MealFrame(tk.Frame):
def __init__(self, master, name, image_path):
tk.Frame.__init__(self, master, highlightbackground="grey", highlightthickness=2)
self.name = name
self._food_image = ImageTk.PhotoImage(
Image.open(image_path).resize((300, 200), Image.Resampling.LANCZOS)
)
tk.Label(self, image=self._food_image).pack()
self._selected_var = tk.BooleanVar()
tk.Checkbutton(self, text=name, variable=self._selected_var).pack(side = tk.LEFT)
self._number_servings = tk.Entry(self, justify='center', width=10)
self._number_servings.insert(0, 2)
self._number_servings.pack(side = tk.RIGHT)
tk.Label(self, text='Portionen: ', bg="light grey").pack(side = tk.RIGHT)
@property
def is_selected(self):
return self._selected_var.get()
@property
def is_quantified(self):
return self._number_servings.get()
class tkinterApp(tk.Tk):
# __init__ function for class tkinterApp
def __init__(self, *args, **kwargs):
# __init__ function for class Tk
tk.Tk.__init__(self, *args, **kwargs)
# creating a container
container = tk.Frame(self)
container.pack(side = "top", fill = "both", expand = True)
container.grid_rowconfigure(0, weight = 1)
container.grid_columnconfigure(0, weight = 1)
# initializing frames to an empty array
self.frames = {}
# iterating through a tuple consisting
# of the different page layouts
for F in (Startseite, Deutsch, Asiatisch, Vegetarisch, Italienisch, Fast_Food):
frame = F(container, self)
# initializing frame of that object from
# Startseite, Deutsch, Asiatisch, Vegetarisch, Italienisch, Fast_Food respectively with
# for loop
self.frames[F] = frame
frame.grid(row = 0, column = 0, sticky ="nsew")
self.show_frame(Startseite)
# to display the current frame passed as
# parameter
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
# first window frame Startseite
class Startseite(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = ttk.Label(self, text ="Startseite", font = LARGEFONT)
label.grid(row = 0, column = 0, padx = 10, pady = 10)
button1 = ttk.Button(self, text ="Deutsch",
command = lambda : controller.show_frame(Deutsch))
button1.grid(row = 1, column = 0, padx = 10, pady = 10)
button2 = ttk.Button(self, text ="Asiatisch",
command = lambda : controller.show_frame(Asiatisch))
button2.grid(row = 2, column = 0, padx = 10, pady = 10)
button3 = ttk.Button(self, text ="Vegetarisch",
command = lambda : controller.show_frame(Vegetarisch))
button3.grid(row = 3, column = 0, padx = 10, pady = 10)
button4 = ttk.Button(self, text ="Italienisch",
command = lambda : controller.show_frame(Italienisch))
button4.grid(row = 4, column = 0, padx = 10, pady = 10)
button5 = ttk.Button(self, text ="Fast Food",
command = lambda : controller.show_frame(Fast_Food))
button5.grid(row = 5, column = 0, padx = 10, pady = 10)
---------------------------------------------------- Auf diesen Abschnitt bezieht sich meine Frage ------------------------------------------------------------------------------
def check_selection():
list_meals = []
for frame in self.meal_frames:
if frame.is_selected == True:
list_meals.append(frame.name)
tk.Button(self, text='Einkaufsliste ausgeben', bg="powder blue", command=check_selection).grid(row=6, column=0, pady=10)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
class Deutsch(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = ttk.Label(self, text ="Deutsch", font = LARGEFONT)
label.grid(row = 0, column = 0, padx = 10, pady = 10)
button1 = ttk.Button(self, text ="Startseite",
command = lambda : controller.show_frame(Startseite))
button1.grid(row = 1, column = 0, padx = 10, pady = 10)
button2 = ttk.Button(self, text ="Asiatisch",
command = lambda : controller.show_frame(Asiatisch))
button2.grid(row = 2, column = 0, padx = 10, pady = 10)
button3 = ttk.Button(self, text ="Vegetarisch",
command = lambda : controller.show_frame(Vegetarisch))
button3.grid(row = 3, column = 0, padx = 10, pady = 10)
button4 = ttk.Button(self, text ="Italienisch",
command = lambda : controller.show_frame(Italienisch))
button4.grid(row = 4, column = 0, padx = 10, pady = 10)
button5 = ttk.Button(self, text ="Fast Food",
command = lambda : controller.show_frame(Fast_Food))
button5.grid(row = 5, column = 0, padx = 10, pady = 10)
self.meal_frames = []
column_count = 5
start_row_number = 6
row_number = start_row_number
for i in range(len(german_meals)):
frame = MealFrame(self,
german_meals[i].meal_name, SELF_PATH / german_meals[i].meal_image_name)
if i % column_count == 0 and i >= column_count:
row_number = row_number+1
column_number = i-((row_number-start_row_number)*column_count)
frame.grid(row=row_number, column=column_number, padx=5, pady=5)
self.meal_frames.append(frame)
.
.
.
.
.
def main():
app = tkinterApp()
app.mainloop()
if __name__ == "__main__":
main()