Python 2.7 动态实例化页面Tkinter

Python 2.7 动态实例化页面Tkinter,python-2.7,oop,user-interface,tkinter,Python 2.7,Oop,User Interface,Tkinter,我正在使用最初来自另一个堆栈交换应答的代码构建GUI。我修改了它,因为我想把变量传递到后面的页面,让它们显示值。为此,我尝试使用show()方法创建页面,而不是在按钮事件上显示: 编辑: 上面是我导入的自定义脚本的全部代码。我的主要问题是关于布局。我希望帧堆叠在另一帧之上,但它们不是。为什么要这样做?是什么让我走上获取所需布局的轨道?您的代码的主要问题是您正在创建多个容器。作为程序基础的代码专门设计为在容器中包含多个帧的单个容器 第一步是创建容器,并保存引用,以便以后使用: class vpnR

我正在使用最初来自另一个堆栈交换应答的代码构建GUI。我修改了它,因为我想把变量传递到后面的页面,让它们显示值。为此,我尝试使用show()方法创建页面,而不是在按钮事件上显示:

编辑:
上面是我导入的自定义脚本的全部代码。我的主要问题是关于布局。我希望帧堆叠在另一帧之上,但它们不是。为什么要这样做?是什么让我走上获取所需布局的轨道?

您的代码的主要问题是您正在创建多个容器。作为程序基础的代码专门设计为在容器中包含多个帧的单个容器

第一步是创建容器,并保存引用,以便以后使用:

class vpnRenameProgram(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        self.container = tk.Frame(self)
        self.container.pack(side="top", fill="both", expand=True)
        self.container.grid_rowconfigure(0, weight=1)
        self.container.grid_columnconfigure(0, weight=1)

        self.frames = {}
        self.show_frame("MainView")
我还建议您传递实际的类,而不是类名。这样,您就不必深入
globals()
来根据名称找到正确的类

将上面的最后一行更改为如下所示:

    self.show_frame(MainView)
您还需要更改
get_page
,但现在只需进行简单的查找:

def get_page(self, page_class):
    return self.frames.get(page_class, None)
最后一步是重新定义
show
以按需创建帧。您已经创建了一个名为
instantiate_page
的方法,但我认为没有真正的理由不将其全部放在一个函数中,因为它只是多了几行代码:

def show(self, page_class):
    if page_class in self.frames:
        frame = self.frames[page_class]
    else
        frame = page_class(parent=self.container, controller=self)
        frame.grid(row=0, column=0, sticky="nsew")
        self.frames[page_class] = frame

    frame.tkraise()

就这些。当调用
show
get\u page
(例如:
controller.show(listVPN)
、controller.get\u page(pickFiles)`,等等)时,您只需记住传递类而不是类的名称。

我对您想要什么感到非常困惑。你能提供一个我们可以运行的完整示例来说明你的问题吗?“我已经修改了它,因为我想将变量传递到后面的页面”-你为什么这么做?您从中复制的代码使得在页面之间共享一个公共数据块或让每个页面从任何其他页面获取所需的数据变得非常简单。创建页面时不需要向页面传递数据。这句话很难理解:“我希望每个页面只使用容器的一个实例,因为这会导致每个页面分别分层。”每个页面只使用容器的一个实例。你不需要改变任何事情。此外,您还编写了“我不希望容器成为全局变量”,但
container
不是全局变量。它是一个传递到每个页面的局部变量。您是否阅读了以下问题和答案?然后呢?你能解释一下为什么这两个页面都不能解决你的问题吗?这似乎是一个问题。也许你可以解释你试图解决的真正问题,而不是试图让我们修复你的坏代码。非常感谢,这正好击中了我认为我遇到的问题。现在它正在创建我想要的单个容器。
def show(self, page_class):
    if page_class in self.frames:
        frame = self.frames[page_class]
    else
        frame = page_class(parent=self.container, controller=self)
        frame.grid(row=0, column=0, sticky="nsew")
        self.frames[page_class] = frame

    frame.tkraise()