ich versuche seit einigen tagen, eine GUI zu basten die aus zwei Frames besteht eine mit buttons um die andere mit vorgefertigten frames zufüllen. Ich da auch schon was hinbekommen allerdings ging dies nur mit einer Treeview welche mir [setting_name] mit geschliffen hat, was mit Buttons nicht funktioniert.
Code: Alles auswählen
import tkinter as tk
from tkinter import ttk
class SampleApp(tk.Tk):
def __init__(self):
super().__init__()
settings = SettingsView(self)
settings.add_pages(setting_name=StartPage,
page=StartPage
)
settings.add_pages(setting_name=PageTwo,
page=PageTwo)
settings.pack(fill=tk.BOTH, expand=True)
class SettingsView(ttk.Frame):
def __init__(self, master, **kw):
super().__init__(master, **kw)
self.pages = {}
self.grid_rowconfigure(1, weight=1)
self.grid_columnconfigure(0, weight=1)
self.create_header().grid(row=0, column=0, sticky='enw')
self.create_frame_page().grid(row=1, column=0)
self.show_page(StartPage)
def on_button_clicked(self, setting_name):
setting_name = self.pages[setting_name]
self.show_page(setting_name)
def show_page(self, setting_name):
for page_name in self.pages.keys():
self.pages[page_name].pack_forget()
#
self.pages[setting_name].pack(fill=tk.BOTH, expand=True)
def add_pages(self, setting_name, page):
self.pages[setting_name] = page(self.frame_page)
def create_frame_page(self) -> ttk.Frame:
self.frame_page = ttk.Frame(self)
return self.frame_page
def create_header(self) ->ttk.Frame:
self.frame_header = ttk.Frame(self)
btn_1 = ttk.Button(self.frame_header,
text='Start Page',
#command=lambda : SettingsView.on_button_clicked(StartPage)
)
btn_1.grid(row=0, column=0)
btn_2 = ttk.Button(self.frame_header,
text='Page Two',
#command=lambda : self.on_btn_clicked()
)
btn_2.grid(row=0, column=1)
return self.frame_header
######### Pages ########
class Page (ttk.Frame):
def __init__(self, master, **kw):
super().__init__(master, **kw)
class StartPage(Page): #ToDo Startpage, mit Matplotlib
def __init__(self, master, **kw):
super().__init__(master, **kw)
self.create_frame_content().pack(fill=tk.BOTH, expand=True)
def create_frame_content(self) ->ttk.Frame:
"""
Create the widget specific to this Settings
:return: ttk.Frame
"""
self.frame_content = ttk.Frame(self)
lbl_StartPage = ttk.Label(self.frame_content,
text='Startpage')
lbl_StartPage.pack()
return self.frame_content
class PageTwo(Page): # ToDo
def __init__(self, master, **kw):
super().__init__(master, **kw)
self.create_frame_content().pack(fill=tk.BOTH, expand=True)
def create_frame_content(self) -> ttk.Frame:
"""
Create the widget specific to this Settings
:return: ttk.Frame
"""
self.frame_content = ttk.Frame(self)
lbl_PageTwo = ttk.Label(self.frame_content,
text='Page two')
lbl_PageTwo.pack()
return self.frame_content
if __name__=='__main__':
app = SampleApp()
app.mainloop()
self.pages[setting_name].pack(fill=tk.BOTH, expand=True)
Also Frage:
Geht das überhaupt, wenn ja bin ich auf den richtigen weg? Für einen denkanstoß wäre ich sehr dankbar