【问题标题】:Switching frames in tkinter:在 tkinter 中切换帧:
【发布时间】:2018-06-07 01:51:50
【问题描述】:

我正在尝试制作一个简单的魔术八球应用程序,只是为了练习。我正在使用 tkinter 和 python 3.0。我正在尝试将帧切换到应用程序的下一部分,但无法绕过它。我只是想知道这段代码有什么问题,因为每次我尝试更正它时,它都会出现错误“未定义容器”或“PageOne 没有属性 'tk'”。我想说到目前为止我对 tkinter 相当满意,并且可以制作只有一页的基本 GUI。但是,我似乎无法做到这一点。这是代码:

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

我做错了什么?

【问题讨论】:

  • 我相当有信心@ReblochonMasque 链接的问题是您获得大部分代码的地方。然而,问题是您所做的更改会破坏代码示例的工作。你确定你完全理解你开始使用的代码吗?如果没有,你真的应该尝试,否则你会遇到更多的困难。

标签: python tkinter


【解决方案1】:

工作代码:

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,因为这是它的名字

  • EightBall.show_frame 中的container 替换为controller,因为这是通过的

  • EightBall.__init__ 中的pack() 替换为grid(row=0, column=0) 以将框架彼此重叠

  • PageOne.__init__ 中的Entry 之前添加了tk.

  • 去掉了空行,耦合了最后两行,让代码不滚动就装好了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2018-07-17
    • 2020-10-10
    • 2011-11-24
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多