Вот как применить шаблон, показанный в одном из многих ответов @Bryan Oakley, связанных с tkinter, к вашему коду. Он добавляет pages
словарный атрибут к классу MainView
, который можно использовать в подклассах Page
для ссылки на любой экземпляр другого по имени класса.
Чтобы облегчить это, к вызывающей последовательности каждого подкласса был добавлен именованный аргумент controller
. Это будет случай MainView
управления ими.
Примечание. Я также добавил Button
к вашему StudyPage
, который идет к ModifyPage
, чтобы дать вам лучшее представление о шаблоне.
from tkinter import *
class Page(Frame):
def __init__(self, *args, **kwargs):
Frame.__init__(self, *args, **kwargs)
def show(self):
self.lift()
class SelectionPage(Page):
def __init__(self, controller, *args, **kwargs):
Page.__init__(self, *args, **kwargs)
label = Label(self, text='Selection page')
label.pack()
def study_button():
studypage = controller.pages['StudyPage']
studypage.show()
print("study")
studybutton = Button(self, text="Study", command=study_button)
studybutton.pack()
class StudyPage(Page):
def __init__(self, controller, *args, **kwargs):
Page.__init__(self, *args, **kwargs)
label = Label(self, text='This is the study page')
label.pack()
def modify_button():
modifypage = controller.pages['ModifyPage']
modifypage.show()
print("modifying")
modifybutton = Button(self, text="Modify", command=modify_button)
modifybutton.pack()
class ModifyPage(Page):
def __init__(self, controller, *args, **kwargs):
Page.__init__(self, *args, **kwargs)
label = Label(self, text='This is the modify page')
label.pack()
class MainView(Frame):
def __init__(self, *args, **kwargs):
Frame.__init__(self, *args, **kwargs)
# Create dictionary of Page subclasses.
self.pages = {}
for Subclass in (StudyPage, SelectionPage, ModifyPage):
self.pages[Subclass.__name__] = Subclass(self)
studypage, selectionpage, modifypage = self.pages.values()
container = Frame(self)
container.pack(side="top", fill="both", expand=True)
studypage.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
selectionpage.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
modifypage.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
selectionpage.show()
if __name__ == "__main__":
root = Tk()
main = MainView(root)
main.pack(side="top", fill="both", expand=True)
root.wm_geometry("400x400")
root.mainloop()