ich habe ein kleines Programm geschrieben und zwar eine Speisekarte.
Gespeichert wird diese in einer SQLite Datenbank und beinhaltet die Kategorie, den Namen und den Preis.
Das Programm gibt mir geordnet nach den Kategorien die Gerichte aus, Name und Preis.
Wenn ich auf eine Kategorie klicke kann ich dort ein neues Gericht hinzufügen.
Wenn ich auf eine bereits vorhandene Speise klicke, kann ich diese in allen drei Bereichen modifizieren oder ganz löschen.
Mein Problem liegt im aktualisieren der Seite, nachdem ich etwas verändert habe. Beim ersten Laden kann ich zwischen oberen und unterem Ende der Ausgabe hin und her scrollen. Wenn ich die Seite allerdings neu Lade, ist der untere Teil der Speisekarte an den oberen Rand des Fensters verschoben und ich muss den Inhalt per Mousescroll nach unten holen.
Code: Alles auswählen
class Window:
def __init__(self, master):
self.master = master
self.is_window_open = False # Marker ob 2. Fenster auf
self.canvas = None
self.scrollbar = None
self.menu_frame = None
self.end_button = None
self.refresh_button = None
self.set_properties() # Gestaltet das Fenster
self.print_menu() # gibt das Fenster aus
def print_menu(self):
categories = ['Vorspeise', 'Hauptspeise', 'Nachspeise', 'Getränk']
# Für jede Kategorie die entsprechenden Gerichte und Preise aus der Datenbank abfragen
for category in categories:
cursor.execute('SELECT gericht, preis FROM test_table WHERE kategorie = ?', (category,))
menu_items = cursor.fetchall()
# Kategorien lassen sich anklicken um neue Speisen einzufuegen
category_label = tk.Label(self.menu_frame, text=category, font=("Helvetica", 16, 'bold'), bg="#feebed",
padx=5, pady=5)
category_label.pack(fill=tk.BOTH)
category_label.bind('<Button-1>', lambda event, cat=category: self.add_item_window(cat))
# Wenn es Gerichte in dieser Kategorie gibt, diesem Button angehangen
if menu_items:
for item in menu_items:
label_text = f'{item[0]:<20} {item[1]:>10} €'
item_label = tk.Label(self.menu_frame, text=label_text, font=("Helvetica", 14), bg="#efeaec")
item_label.pack()
item_label.bind('<Button-1>', lambda event, category=category, name=item[0],
preis=item[1],: self.configure_item_window(category, name,
preis))
def refresh_menu(self):
# Zerstöre die Labels und die Scrollbar
for widget in self.menu_frame.winfo_children():
widget.destroy()
for widget in self.button_frame.winfo_children():
widget.destroy()
self.menu_frame.destroy()
self.button_frame.destroy()
self.canvas.destroy()
self.scrollbar.destroy()
# Erstelle die Scrollbar und rufe print_menu() erneut auf, um die aktualisierten Labels anzuzeigen
self.set_properties()
self.print_menu()
def set_properties(self):
# Style Hauptfenster
self.master.title("Speisekarte")
self.master.geometry("800x600")
screen_width = self.master.winfo_screenwidth()
screen_height = self.master.winfo_screenheight()
window_width = 800
window_height = 600
x_coordinate = (screen_width / 2) - (window_width / 2)
y_coordinate = (screen_height / 2) - (window_height / 2)
self.master.geometry("%dx%d+%d+%d" % (window_width, window_height, x_coordinate, y_coordinate))
self.master.configure(bg="#efeaec")
# Erstelle ein Canvas
self.canvas = tk.Canvas(self.master, bg="#efeaec", highlightthickness=0, width=400, height=600)
self.canvas.pack(side=tk.LEFT, fill=tk.Y, expand=True)
# Füge einen Scrollbar hinzu
self.scrollbar = ttk.Scrollbar(self.master, orient=tk.VERTICAL, cursor="arrow", command=self.canvas.yview)
self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# Verbinde den Scrollbar mit dem Canvas und konfiguriere die scrollregion
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.scrollbar.configure(command=self.canvas.yview)
self.canvas.bind('<Configure>', lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all")))
self.canvas.bind_all("<MouseWheel>", self.scroll_canvas)
self.scrollbar.set(0.0, 0.0)
# Erstelle ein Frame, um die Labels(Gerichte) zu halten
self.menu_frame = tk.Frame(self.canvas, bg="#efeaec", width=500)
self.menu_frame.pack(side=tk.TOP, fill=tk.X, padx=20, pady=20)
# Erstelle ein Frame, um die Buttons(Beenden/Refresh) zu halten
self.button_frame = tk.Frame(self.canvas, bg="#efeaec", width=500)
self.button_frame.pack(side=tk.BOTTOM, fill=tk.X, padx=20, pady=20)
self.canvas.create_window((0, 0), window=self.button_frame, anchor='nw')
self.canvas.create_window((0, 0), window=self.menu_frame, anchor='sw')
# Beenden und Refresh Button
self.end_button = tk.Button(self.button_frame, text="Beenden", command=self.master.quit, # Button zum beenden
font=("Helvetica", 16), bg="#bf717e", fg="black")
self.end_button.pack(side=tk.LEFT, padx=10, pady=10, anchor='w')
self.refresh_button = tk.Button(self.button_frame, text="Refresh", command=lambda: self.refresh_menu(),
font=("Helvetica", 16), bg="#bf717e", fg="black")
self.refresh_button.pack(side=tk.LEFT, padx=10, pady=10, anchor='w')
def scroll_canvas(self, event):
if event.delta:
direction = 1 if event.delta > 0 else -1
self.canvas.yview_scroll(direction, "units")