Как создать новые страницы с использованием классов в Tkinter? - PullRequest
0 голосов
/ 08 ноября 2018

Я попытался создать графический интерфейс tkinter, который может перекрывать каждую страницу Page 1, Page 2, Page 3. Я борюсь в двух местах:

Использование класса, а не метода, поэтому я закомментировал их, но я попытался заключить класс в скобки внутри команды, т.е. command=(mainPage), но это дает ошибку:

builtins.NameError: name 'mainPage' is not defined

Второе место, с которым я борюсь, это невозможность перекрывать каждый класс.

Мой код выглядит следующим образом:

from tkinter import *

class testOverlap(Frame):

    def __init__(self, root):
        Frame.__init__(self, root)
        self.root = root

        self.topButtons()

        self.pageOne()
        self.pageTwo()
        self.pageThree()

    def topButtons(self):

        self.firstPage = Button(self.root, text="Go to Page 1", background="WHITE", height = 2, width = 16, command= self.pageOne())
        self.firstPage.place(x=0, y=0)

        self.secondPage = Button(self.root, text="Go to Page 2", background="WHITE",height = 2, width = 16, command= self.pageTwo())
        self.secondPage.place(x=121, y=0)

        self.thirdPage = Button(self.root, text="Go to Page 3", background="WHITE",height = 2, width = 17, command= self.pageThree())
        self.thirdPage.place(x=242, y=0)

#class mainPage(Frame):
    def pageOne(self):
        self.Label1 = Label(self.root, text=" First Page ", height = 20, width = 52, background="Green")
        self.Label1.place(x=0, y=40)

#class middlePage(Frame):
    def pageTwo(self):
        self.Label2 = Label(self.root, text=" Second Page ", height = 20, width = 52, background="Blue")
        self.Label2.place(x=0, y=40)

#class finalPage(Frame):
    def pageThree(self):
        self.Label3 = Label(self.root, text=" Third Page ", height = 20, width = 52, background="Red")
        self.Label3.place(x=0, y=40)

def main():
    root = Tk()
    root.title("Tk")
    root.geometry('370x340')
    app = testOverlap(root)
    root.mainloop()


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 08 ноября 2018

Создание фрейма (страницы) и его поднятие (перемещение наверх для просмотра) - это 2 совершенно разные операции. Чтобы создать его, вам нужно использовать макет типа grid для экземпляра класса, а для его поднятия вам нужно использовать метод tkraise экземпляра. Обычно мы делаем это, выделяя классу ничего, кроме обработки всех страниц. Попробуйте это:

from tkinter import *

class Controller(Frame):
    def __init__(self, root):
        Frame.__init__(self, root)

        self.pageOne = mainPage(self)
        self.pageOne.grid(row=0, column=0, sticky='nsew')
        self.pageTwo = middlePage(self)
        self.pageTwo.grid(row=0, column=0, sticky='nsew')
        self.pageThree = finalPage(self)
        self.pageThree.grid(row=0, column=0, sticky='nsew')
        self.menu = testOverlap(self)
        self.menu.grid(row=0, column=0, sticky='nsew')

        self.menu.tkraise() # show the testOverlap Frame now

class testOverlap(Frame):
    def __init__(self, root):
        Frame.__init__(self, root)
        self.topButtons()

    def topButtons(self):
        self.firstPage = Button(self, text="Go to Page 1", background="WHITE", height = 2, width = 16, command= self.master.pageOne.tkraise)
        self.firstPage.grid(row=0, column=0)

        self.secondPage = Button(self, text="Go to Page 2", background="WHITE",height = 2, width = 16, command= self.master.pageTwo.tkraise)
        self.secondPage.grid(row=0, column=1)

        self.thirdPage = Button(self, text="Go to Page 3", background="WHITE",height = 2, width = 17, command= self.master.pageThree.tkraise)
        self.thirdPage.grid(row=0, column=2)

class mainPage(Frame):
    def __init__(self, root):
        Frame.__init__(self, root)
        self.Label1 = Label(self, text=" First Page ", height = 20, width = 52, background="Green")
        self.Label1.grid()

class middlePage(Frame):
    def __init__(self, root):
        Frame.__init__(self, root)
        self.Label2 = Label(self, text=" Second Page ", height = 20, width = 52, background="Blue")
        self.Label2.grid()

class finalPage(Frame):
    def __init__(self, root):
        Frame.__init__(self, root)
        self.Label3 = Label(self, text=" Third Page ", height = 20, width = 52, background="Red")
        self.Label3.grid()

def main():
    root = Tk()
    root.title("Tk")
    root.geometry('370x340')
    app = Controller(root)
    app.pack(expand=True, fill=BOTH)
    root.mainloop()

if __name__ == '__main__':
    main()

Обратите внимание, я также исключил использование вами place. Я рекомендую вам держаться подальше от места, если можете, используйте grid или pack. Использование места требует указания точного размера во многих других местах, и сетка или пакет могут с этим справиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...