Выбор страниц с помощью tkInter - PullRequest
0 голосов
/ 11 января 2020

Я новичок в python и пытаюсь сделать GUI с tkinter для учебного приложения. У меня проблемы с настройкой моей программы, чтобы иметь возможность переходить на разные страницы. Я использовал этот вопрос о переполнении стека для настройки своего кода.

Использование кнопок в Tkinter для перехода на разные страницы приложения?

проблема с этим конкретным решением что он создает кнопки в верхней части родительского окна, которые позволяют пользователю переходить на каждую страницу в программе. В моей программе не было бы смысла позволять пользователю переходить на любую страницу в любое время. Как бы я создал кнопку на указанной странице c, которая позволит мне перейти на другую страницу?

study_button() - моя попытка на этом

from tkinter import *

#initializes each page as a class
class Page(Frame):
    def __init__(self, *args, **kwargs):
        Frame.__init__(self, *args, **kwargs)
    def show(self):
        self.lift()

#creates a specific page
class SelectionPage(Page):
    def __init__(self, *args, **kwargs):
        Page.__init__(self, *args, **kwargs)
        label = Label(self, text='selection page')
        label.pack()

        def study_button():
            studypage = StudyPage(self)
            studypage.lift()

            print("study")

        studybutton = Button(self, text = "Study", command=study_button)
        studybutton.pack()


class StudyPage(Page):
    def __init__(self, *args, **kwargs):
        Page.__init__(self, *args, **kwargs)
        label = Label(self, text = 'this is the study page')
        label.pack()

class ModifyPage(Page):
    def __init__(self, *args, **kwargs):
        Page.__init__(self, *args, **kwargs)
        label = Label(self, text = 'this is the modify page')
        label.pack()
#base page
class MainView(Frame):
    def __init__(self, *args, **kwargs):
        Frame.__init__(self, *args, **kwargs)

        studypage = StudyPage(self)
        selectionpage = SelectionPage(self)
        modifypage = ModifyPage(self)

        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()

1 Ответ

0 голосов
/ 12 января 2020

Вот как применить шаблон, показанный в одном из многих ответов @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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...