Ich suche eine Möglichkeit beim Arbeiten mit überlagerten Frames diese besser zu organisieren.
Momentan arbeite ich vor allem mit der methode .tkraise()
Vor allem scheitert es gerade daran zwischen einem Frame und dem zuletzt angezeigten zu wechseln.
Bezogen auf meinen untenstehenden Beispielcode bedeutet dass, der Button "Switch" soll zwischen Frame4 und, bei erneutem klick, dem ZULETZT aktiven vor dem wechsel switchen.
Leider habe ich keine Möglichkeit gefunden zu testen welches Frame gerade "oben" ist.
Das gerade aktive in einer globalen Variable zu speichern erscheint mir auch nicht sinnvoll.
Des weiteren wäre es gut die Frames wie gesagt besser zu organisieren.
Jeder Klasse jedes Frame-Objekt als Argument mitzugeben ist keine schöne Lösung...
Vielleicht die Frames über eine spezielle Klasse organisieren und dann die Klassen-Objekte in einem Dictionary speichen?
Hier hoffe ich auf Ideen und Möglichkeiten von euch.
MfG
Blackshie
Code: Alles auswählen
import tkinter as tk
def _show_frame(frame):
frame.tkraise()
# Erstellen der Beispiel Frames
class TestFrame1(tk.Frame):
def __init__(self, main, width, height):
tk.Frame.__init__(self, main)
self.config(bg="green")
self.place(relx=0, rely=0, height=height, width=width)
class TestFrame2(tk.Frame):
def __init__(self, main, width, height):
tk.Frame.__init__(self, main)
self.config(bg="red")
self.place(relx=0, rely=0, height=height, width=width)
class TestFrame3(tk.Frame):
def __init__(self, main, width, height):
tk.Frame.__init__(self, main)
self.config(bg="yellow")
self.place(relx=0, rely=0, height=height, width=width)
class TestFrame4(tk.Frame):
def __init__(self, main, width, height):
tk.Frame.__init__(self, main)
self.config(bg="orange")
self.place(relx=0, rely=0, height=height, width=width)
class ControlFrame(tk.Frame):
def __init__(self, main, width, fr_test_frame_1, fr_test_frame_2, fr_test_frame_3):
tk.Frame.__init__(self, main)
self.config(bg="grey")
self.place(x=0, y=380, height=100, width=width)
# Fenster Zeichen
tk.Button(self, text="TestFrame1", command=lambda: _show_frame(fr_test_frame_1)).pack()
tk.Button(self, text="TestFrame2", command=lambda: _show_frame(fr_test_frame_2)).pack()
tk.Button(self, text="TestFrame3", command=lambda: _show_frame(fr_test_frame_3)).pack()
tk.Button(self, text="Switch").pack() # Hier mangelt es...
def main():
# Konstanten
WM_HEIGHT = 480
WM_WIDTH = 800
# Hauptfenster
main = tk.Tk()
main.title("Test")
main.geometry("{:}x{:}".format(WM_WIDTH, WM_HEIGHT))
# main.attributes("-fullscreen", True)
main.resizable(0, 0)
fr_1 = TestFrame1(main, WM_WIDTH, WM_HEIGHT-100)
fr_2 = TestFrame2(main, WM_WIDTH, WM_HEIGHT-100)
fr_3 = TestFrame3(main, WM_WIDTH, WM_HEIGHT-100)
fr_4 = TestFrame1(main, WM_WIDTH, WM_HEIGHT-100)
ControlFrame(main, WM_WIDTH, fr_1, fr_2, fr_3)
main.mainloop()
if __name__ == '__main__':
main()