Python Tkinter具有不同模块中的列表和页面堆叠框架
我下面的代码最初是从链接中获取的,我已经阅读了其中的所有文档,但我觉得我忽略了一些东西,我在单独的模块中有页面,还有一个单独的模块,带有用于向窗口添加页面的Add类 我们的想法是以后能够将一个模块放到一个子文件夹中,其中包含一个Pagexxx对象,并调用addpage类来允许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
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还是比较陌生的,但是感谢你提供的提示,验证我的假设,我按照你说的和检查的做了,至于忘记将其添加到容器中,我必须在过去的几个小时内成为代码盲,检查了链接中的代码。