ich versuche gerade eine TKinter-App mit 3 Frames zu bauen, wobei der mittlere Frame wechselnd sein muss. Folgenden Code habe ich versucht:
Code: Alles auswählen
import tkinter as tk
from tkinter import ttk
class Frame1(ttk.Frame):
def __init__(self, container, job_selection):
super().__init__(container)
self.job_selection = job_selection
# field options
self.options = {'padx': 5, 'pady': 5}
# job label
self.job_label = ttk.Label(self, text="Parameter " + job_selection)
self.job_label.grid(column=0, row=0, sticky='w', **self.options)
# Termin label + Eingabe
self.termin_label = ttk.Label(self, text="Termin Frame1: ")
self.termin = tk.StringVar()
self.termin_entry = ttk.Entry(self, textvariable=self.termin)
self.termin_label.grid(column=0, row=1, sticky='w', **self.options)
self.termin_entry.grid(column=1, row=1, sticky='w', **self.options)
# add padding to the frame and show it
self.grid(column=0, row=1, padx=5, pady=5, sticky="nsew")
self.execframe = ExecFrame(container,
self.termin
)
self.execframe.tkraise()
def reset(self):
self.job_label.text = ''
class Frame2(ttk.Frame):
def __init__(self, container, job_selection):
super().__init__(container)
self.job_selection = job_selection
# field options
self.options = {'padx': 5, 'pady': 5}
# job label
self.job_label = ttk.Label(self, text="Parameter " + job_selection)
self.job_label.grid(column=0, row=0, sticky='w', **self.options)
# Termin label + Eingabe
self.termin_label = ttk.Label(self, text="Termin Frame2: ")
self.termin = tk.StringVar()
self.termin_entry = ttk.Entry(self, textvariable=self.termin)
self.termin_label.grid(column=0, row=1, sticky='w', **self.options)
self.termin_entry.grid(column=1, row=1, sticky='w', **self.options)
# add padding to the frame and show it
self.grid(column=0, row=1, padx=5, pady=5, sticky="nsew")
self.execframe = ExecFrame(container,
self.termin)
self.execframe.tkraise()
def reset(self):
self.job_label.text = ''
class ExecFrame(ttk.Frame):
def __init__(self,
container,
termin,
):
super().__init__(container)
self.termin = termin
self.options = {'padx': 5, 'pady': 20}
self.start_button = ttk.Button(self, text='Start', command=self.job_start)
self.start_button.grid(column=0, row=2, sticky='w', **self.options)
self.grid(column=0, row=2, padx=5, pady=5, sticky="nsew")
def job_start(self):
print(self.termin.get())
class ControlFrame(ttk.Frame):
def __init__(self, container):
super().__init__(container)
self.selected_frame = tk.StringVar()
self.frame_selection = ('Frame1', 'Frame2')
self.auswahl = ttk.Combobox(self, textvariable=self.selected_frame)
self.auswahl['values'] = self.frame_selection
self.auswahl['state'] = 'readonly'
self.auswahl.current(0)
self.auswahl.grid(column=0, row=0, padx=5, pady=5)
self.grid(column=0, row=0, padx=5, pady=5, sticky='ew')
self.frames = {}
self.frames['Frame1'] = Frame1(
container,
'Aktion1')
self.frames['Frame2'] = Frame2(
container,
'Aktion2')
self.auswahl.bind('<<ComboboxSelected>>', self.change_frame)
def change_frame(self, event):
frame = self.frames[self.auswahl.get()]
frame.reset()
frame.tkraise()
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title('Framebeispiel')
self.geometry('300x600')
self.resizable(False, False)
if __name__ == "__main__":
app = App()
ControlFrame(app)
app.mainloop()
Wenn ich es starte zeigt er in der Combobox "Frame1" an und unten aber den Inhalt von Frame 2. Wenn ich jetzt einen Termin eingebe und Start drücke, gibt er diesen auch aus. Jetzt wechsel ich "richtig" zu Frame 1 und gebe nochmal einen Wert ein, aber beim Klick auf Start kommt immer noch der Wert von Frame2. Es scheint, als ob er Frame1 nicht aktiviert. Wie bekomme ich das hin?