Переключение кадров в ткинтер: - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь сделать простое приложение Magic Eight Ball просто для практики.Я использую tkinter и python 3.0.Я пытаюсь переключить фреймы на следующую часть приложения, но не могу обойти это.Мне просто интересно, что не так с этим кодом, так как каждый раз, когда я пытаюсь его исправить, он просто выдает ошибку «контейнер не определен» или «PageOne не имеет атрибута« tk »».Я хотел бы сказать, что я до сих пор довольно комфортно с tkinter и могу создавать базовые графические интерфейсы, которые имеют только одну страницу.Тем не менее, я просто не могу с этим работать.Вот код:

import tkinter as tk

class EightBall(tk.Tk):

        def __init__(self, *args, **kwargs):

                tk.Tk.__init__(self, *args,**kwargs)
                container = tk.Frame(self)

                container.configure(width=500, height=500)
                container.pack()


                self.frames={}

                for F in (StartPage, PageOne):

                        frame = F(container,self)

                        self.frames[F]=frame

                        frame.configure(width=500,height=500)
                        frame.pack()


                self.show_frame(StartPage)


        def show_frame(self,controller):

                frame=self.frames[container]
                frame.tkraise()



class StartPage(tk.Frame):

        def __init__(self, parent, controller):
            tk.Frame.__init__(self,parent)
            HomeButton=tk.Button(self, text="Press to play",
                                     command=lambda: controller.show_frame(PageOne))
            HomeLabel=tk.Label(self, text="Magic 8 Ball", fg="white",bg="blue")
            HomeLabel.configure(font="Arial 22")
            HomeButton.place(relx=0.5,rely=0.5,anchor="center")
            HomeLabel.place(relx=0.35,y=10)


class PageOne(tk.Frame):

        def __init__(self, parent, controller):
            tk.Frame.__init__(self,parent)
            PageOneLabel=tk.Label(PageOne,text="What is your name?")
            PageOneEntry=Entry(PageOne)
            PageOneButton=tk.Button(PageOne, text="Enter",
                                        command=lambda: controller.show_frame(PageTwo))
            PageOneLabel.place(relx=0.50,rely=0.45)
            PageOneEntry.place(relx=0.50,rely=0.50)
            PageOneButton.place(relx=0.50,rely=0.55)
app=EightBall()
app.mainloop()

Что я делаю не так?

1 Ответ

0 голосов
/ 08 июня 2018

Рабочий код:

import tkinter as tk
class EightBall(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args,**kwargs)
        self.container = tk.Frame(self)
        self.container.pack()
        self.frames={}
        for F in (StartPage, PageOne):
            frame = F(self.container, self)
            self.frames[F]=frame
            frame.configure(width=500, height=500)
            frame.grid(row=0, column=0)
            self.show_frame(StartPage)
    def show_frame(self, controller):
        frame=self.frames[controller]
        frame.tkraise()
class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        HomeButton=tk.Button(self, text="Press to play",
                                 command=lambda: controller.show_frame(PageOne))
        HomeLabel=tk.Label(self, text="Magic 8 Ball", fg="white",bg="blue")
        HomeLabel.configure(font="Arial 22")
        HomeButton.place(relx=0.5,rely=0.5,anchor="center")
        HomeLabel.place(relx=0.35,y=10)
class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        PageOneLabel=tk.Label(self,text="What is your name?")
        PageOneEntry=tk.Entry(self)
        PageOneButton=tk.Button(self, text="Enter",
                                    command=lambda: controller.show_frame(StartPage))
        PageOneLabel.place(relx=0.50,rely=0.45)
        PageOneEntry.place(relx=0.50,rely=0.50)
        PageOneButton.place(relx=0.50,rely=0.55)
app=EightBall() ; app.mainloop()

Исправления:

  • Удалена бесполезная конфигурация в EightBall.__init__

  • Заменено PageTwo на StartPage, поскольку это его имя

  • Заменено container на controller в EightBall.show_frame, поскольку это то, что передано

  • Заменено pack() на grid(row=0, column=0) в EightBall.__init__, чтобы поместить кадры друг на друга

  • Добавлено tk. перед Entry в PageOne.__init__

  • Убраны пустые строки, соединены последние две, чтобы код соответствовал без прокрутки.

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