在 GUI 编程环境中,单个应用程序窗口中包含多个页面是很常见的。每个页面可能包含各种小部件,例如输入字段、按钮或标签。当与这些小部件交互时,用户提供输入或做出需要在不同页面之间共享的选择。这就提出了如何从一个类访问另一个类的变量数据的问题,特别是当这些类代表不同的页面时。
一种有效的方法是利用控制器类的概念。在您提供的代码片段中,您有一个管理多个页面的 MyApp 类,例如 PageOne 和 PageTwo。通常,控制器充当应用程序不同部分之间的中介并促进通信。以下是如何使用控制器获取变量数据:
在每个页面类中添加对控制器的引用:
class PageOne(ttk.Frame):
def __init__(self, parent, controller):
self.controller = controller
在控制器中创建一个方法,通过其类名获取页面实例:
class MyApp(Tk):
def get_page(self, classname):
for page in self.frames.values():
if str(page.__class__.__name__) == classname:
return page
从另一个页面访问目标页面的公共成员:
class PageTwo(ttk.Frame):
def print_it(self):
page_one = self.controller.get_page("PageOne")
value = page_one.some_entry.get()
或者,您可以考虑在控制器本身而不是页面中存储共享数据类。这种方法将页面彼此解耦,并减少了它们之间紧密耦合的需要。实现方式如下:
在控制器中创建一个数据结构来存储所有共享数据:
class MyApp(Tk):
def __init__(self):
self.app_data = {"name": StringVar(),
"address": StringVar()}
创建widgets时修改每个页面引用控制器的数据结构:
class PageOne(ttk.Frame):
def __init__(self, parent, controller):
self.controller = controller
self.some_entry = ttk.Entry(self, textvariable=self.controller.app_data["name"])
从控制器而不是页面类访问共享数据:
class PageTwo(ttk.Frame):
def print_it(self):
value = self.controller.app_data["address"].get()
通过实施其中一种方法,您可以在 GUI 应用程序中的不同页面类之间有效地共享变量数据。基于控制器的方法提供了紧密耦合和集中的通信控制点,同时将数据存储在控制器中促进了解耦和灵活性。方法的选择取决于应用程序的具体要求以及页面之间所需的交互和数据共享的级别。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3