@John_0815: Dein Code muss die `lift`-Methode auch *aufrufen*. Dann funktionieren die beiden Buttons oben.
Das Menü funktioniert nicht weil `text` in der Schleife am Ende immer den Wert des letzten Menüpunktes hat. Wenn man Werte zum Zeitpunkt der Definition des Rückrufs haben möchte, und nicht zum Zeitpunkt des späteren Aufrufs, kann man ``lambda`` so nicht verwenden, und eigentlich wurde `functools.partial()` genau für diese Fälle erfunden.
Was auch falsch ist, ist ``Main.toggle_page(master, text)``, denn dazu müsste `master` vom Typ `Main` sein, dann könnte und sollte man aber ``master.toggle_page(text)`` schreiben. `master` ist aber gar nicht vom Typ `Main`.
Ich würde da auch nicht diesen unnötigen Umweg über Zeichenketten für die Seiten gehen, sondern direkt die Widgets verwenden.
Code: Alles auswählen
#!/usr/bin/env python3
import tkinter as tk
from functools import partial
from tkinter import ttk
COLORS = [
"red",
"yellow",
"DarkOrange1",
"#FF0080",
"green",
"cyan",
"spring green",
"chartreuse",
"blue",
"magenta",
"#0080FF",
"#8000FF",
"white",
"black",
]
STYLE = {
"TFrame": {"background": "black", "anchor": tk.CENTER},
"TLabel": {
"background": "black",
"foreground": "green",
"font": "Times 13",
"anchor": tk.CENTER,
},
"head.TLabel": {"font": "Times 15 bold"},
"head2.TLabel": {"font": "Times 14 bold"},
"TButton": {
"background": "black",
"foreground": "green",
"font": "Times 13",
"anchor": tk.CENTER,
},
"back.TButton": {
"background": "white",
"foreground": "red",
"font": "Times 15 bold",
},
"config.TButton": {"relief": tk.FLAT},
}
def create_main_frame(master, toggle_page, menu_items):
frame = ttk.Frame(master)
ttk.Label(frame, text="Beleuchtungssteuerung", style="head2.TLabel").pack(
padx=3, pady=3
)
for text, page in menu_items:
ttk.Button(frame, text=text, command=partial(toggle_page, page)).pack(
expand=True, fill=tk.BOTH, padx=3, pady=3
)
return frame
def create_select_area_frame(master):
frame = ttk.Frame(master)
ttk.Label(frame, text="Bereich auswählen", style="head2.TLabel").pack(
padx=3, pady=3
)
def create_select_color_frame(master):
frame = ttk.Frame(master)
ttk.Label(frame, text="Farbe wählen", style="head2.TLabel").pack(
padx=3, pady=3
)
button_frame = ttk.Frame(frame)
buttons_per_row = 4
for column in range(buttons_per_row):
button_frame.columnconfigure(column, weight=1)
for i, color in enumerate(COLORS):
row, column = divmod(i, buttons_per_row)
button_frame.rowconfigure(row, weight=1)
tk.Button(button_frame, bg=color).grid(
row=row, column=column, sticky=tk.NSEW, padx=3, pady=3
)
assert buttons_per_row - column - 1 == 2, "not exactly 2 columns left"
ttk.Button(button_frame, text="individuell").grid(
row=row,
column=column + 1,
columnspan=2,
sticky=tk.NSEW,
padx=3,
pady=3,
)
button_frame.pack(expand=True, fill=tk.BOTH, padx=3, pady=3)
return frame
def create_set_color_frame(master):
frame = ttk.Frame(master)
ttk.Label(frame, text="Farbe einstellen", style="head2.TLabel").pack(
padx=3, pady=3
)
buttons_frame = ttk.Frame(frame)
for scale in ["red", "green", "blue", "white"]:
tk.Scale(
frame,
from_=255,
to=0,
bg=scale,
troughcolor="black",
tickinterval=50,
sliderlength=50,
).pack(side="left", expand=True, fill=tk.BOTH)
ttk.Button(frame, text="Weiter").pack(
side="left", expand=True, fill=tk.X, anchor="s"
)
buttons_frame.pack(expand=True, fill=tk.BOTH, padx=3, pady=3)
return frame
def create_config_frame(master):
frame = ttk.Frame(master)
ttk.Label(frame, text="Einstellungen", style="head2.TLabel").pack(
padx=3, pady=3
)
buttons_frame = ttk.Frame(frame)
buttons_frame.pack(expand=True, fill=tk.BOTH, padx=3, pady=3)
return frame
def set_styles(master):
style = ttk.Style(master)
for name, values in STYLE.items():
style.configure(name, **values)
class Main(tk.Tk):
def __init__(self):
super().__init__()
self.title("Barbeleuchtung")
self.geometry("480x320")
self.attributes("-fullscreen", False)
self.bind("<F11>", self.toggle_fullscreen)
self.bind("<Escape>", self.toggle_fullscreen)
head_frame = ttk.Frame(self)
head_frame.columnconfigure(1, weight=1)
config_button = ttk.Button(head_frame, width=2, style="config.TButton")
config_button.grid(row=0, column=0, sticky=tk.NW)
ttk.Label(
head_frame, text="Bar Jugendclub Grünberg", style="head.TLabel"
).grid(row=0, column=1, padx=3, pady=3)
back_button = ttk.Button(
head_frame, text="<-", width=4, style="back.TButton"
)
back_button.grid(row=0, column=2, sticky=tk.NE)
head_frame.pack(fill=tk.X)
stacked_frame = ttk.Frame()
stacked_frame.rowconfigure(0, weight=1)
stacked_frame.columnconfigure(0, weight=1)
stacked_frame.pack(expand=True, fill=tk.BOTH)
self.select_color_frame = create_select_color_frame(stacked_frame)
self.select_color_frame.grid(row=0, column=0, sticky=tk.NSEW)
self.set_color_frame = create_set_color_frame(stacked_frame)
self.set_color_frame.grid(row=0, column=0, sticky=tk.NSEW)
self.config_frame = create_config_frame(stacked_frame)
self.config_frame.grid(row=0, column=0, sticky=tk.NSEW)
self.main_frame = create_main_frame(
stacked_frame,
self.toggle_page,
[
("Einfarbig", self.select_color_frame),
("Mehrfarbig", self.set_color_frame),
("Farbwechsel", None), # TODO Hier fehlt noch ein Widget.
],
)
self.main_frame.grid(row=0, column=0, sticky=tk.NSEW)
back_button["command"] = partial(self.toggle_page, self.main_frame)
config_button["command"] = partial(self.toggle_page, self.config_frame)
def toggle_fullscreen(self, _event=None):
self.attributes("-fullscreen", not self.attributes("-fullscreen"))
@staticmethod
def toggle_page(page):
page.lift()
def main():
root = Main()
set_styles(root)
root.mainloop()
if __name__ == "__main__":
main()