Python Tkinter具有不同模块中的列表和页面堆叠框架

Python Tkinter具有不同模块中的列表和页面堆叠框架,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我下面的代码最初是从链接中获取的,我已经阅读了其中的所有文档,但我觉得我忽略了一些东西,我在单独的模块中有页面,还有一个单独的模块,带有用于向窗口添加页面的Add类 我们的想法是以后能够将一个模块放到一个子文件夹中,其中包含一个Pagexxx对象,并调用addpage类来允许Tkinter显示它,但我似乎无法将帧堆叠起来 导航 import tkinter as tk from Page import PageList import Mypages class Windowhandler(tk

我下面的代码最初是从链接中获取的,我已经阅读了其中的所有文档,但我觉得我忽略了一些东西,我在单独的模块中有页面,还有一个单独的模块,带有用于向窗口添加页面的Add类

我们的想法是以后能够将一个模块放到一个子文件夹中,其中包含一个Pagexxx对象,并调用addpage类来允许Tkinter显示它,但我似乎无法将帧堆叠起来

导航

import tkinter as tk
from Page import PageList
import Mypages

class Windowhandler(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand= True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        PageList("Page1", container, self, Mypages.PageOne)
        PageList("Page2", container, self, Mypages.PageTwo)
        self.show_frame("Page1")

    def show_frame(self, cont):
        frameref = PageList.frames[cont]
        print(frameref)
        frameref.tkraise()



app = Windowhandler()
app.mainloop()
Page.py

class PageList():
frames = {}
def __init__(self, name, parent, cont, ref):
    self.frames[name] = ref(parent=parent, controller=cont)
Mypages.py

import tkinter as tk

class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        this = tk.Frame.__init__(self, parent)
        label = tk.Label(this, text="Welcome to Page 1")
        label.pack(pady=10, padx=10)

        button1 = tk.Button(this, text="Back to Home",
                    command=lambda: controller.show_frame("Page2"))
        button1.pack()

class PageTwo(tk.Frame):
    def __init__(self, parent, controller):
        this = tk.Frame.__init__(self, parent)
        label = tk.Label(this, text="Welcome to Page 2")
        label.pack(pady=10, padx=10)

        button1 = tk.Button(this, text="Back to Home",
                    command=lambda: controller.show_frame("Page1"))
        button1.pack()

在向他人寻求帮助之前,第一步是验证您的假设。您假设
tk.Frame.\uuuu init\uuuu(self,parent)
返回一些有用的东西,但您从未通过检查它是否是您认为的东西来验证该假设

第一个问题由两行说明,这两行在两页中基本相同:

this = tk.Frame.__init__(self, parent)
label = tk.Label(this, text="Welcome to Page 1")
我猜您假设
这个
将被设置为
框架的实例
。但是,
\uuuu init\uuu
函数返回
None
,因此
设置为
None
。当
None
作为小部件的父级传递时,该小部件将成为根窗口的子级

解决方法是不要使用
。使用
self

tk.Frame.__init__(self, parent)
label = tk.Label(self, text="Welcome to Page 2")
第二个问题是,您从未使用
网格
打包
、或
放置
将页面添加到容器中,因此它们将永远不可见

您需要更改
Add
,才能将页面实际添加到容器中:

def Add(name, parent, cont, ref):
    PageList.frames[name] = ref(parent=parent, controller=cont)
    PageList.frames[name].grid(row=0, column=0, sticky="nsew")

就目前而言,您在
Page.py
中的类定义是错误的:请参观,谢谢您的输入。我相信我已经在编辑中纠正了这一点。非常感谢@Bryan Oakley,这是有意义的,如果你可能猜到我对python还是比较陌生的,但是感谢你提供的提示,验证我的假设,我按照你说的和检查的做了,至于忘记将其添加到容器中,我必须在过去的几个小时内成为代码盲,检查了链接中的代码。