您有多个页面的小部件在多页面 Tkinter 应用程序中收集用户输入。每个页面都在主应用程序中实例化为一个类,但您在从一个页面 (PageOne) 的另一个页面 (PageTwo) 中的小部件获取 StringVar 的值时遇到困难。
利用控制器,你可以在页面之间建立通信。首先,在每个页面中保存对控制器的引用:
<code class="python">class PageOne(ttk.Frame): def __init__(self, parent, controller): self.controller = controller ... class PageTwo(ttk.Frame): def __init__(self, parent, controller): self.controller = controller ...</code>
其次,在控制器中合并一个方法,根据其类名检索页面:
<code class="python">class MyApp(Tk): ... def get_page(self, classname): '''Returns an instance of a page given it's class name as a string''' for page in self.frames.values(): if str(page.__class__.__name__) == classname: return page return None</code>
使用此方法,页面可以通过调用该函数并获得对目标页面的引用来相互访问。随后,您可以访问该页面的共享成员,如下所示:
<code class="python">class PageTwo(ttk.Frame): ... def print_it(self): page_one = self.controller.get_page("PageOne") value = page_one.some_entry.get() print ('The value stored in StartPage some_entry = %s' % value)</code>
为了避免页面之间的紧密耦合,请考虑将共享数据存储在控制器。此方法允许页面独立于彼此的内部设计:
<code class="python">class MyApp(Tk): def __init__(self): ... self.app_data = {"name": StringVar(), "address": StringVar(), ... }</code>
修改页面在创建小部件时引用控制器:
<code class="python">class PageOne(ttk.Frame): def __init__(self, parent, controller): self.controller=controller ... self.some_entry = ttk.Entry(self, textvariable=self.controller.app_data["name"], ...) </code>
最后,从控制器访问数据,消除需要 get_page:
<code class="python"> def print_it(self): value = self.controller.app_data["address"].get() ...</code>
以上是如何从一个 Tkinter 页面到另一页面访问 StringVar 数据?的详细内容。更多信息请关注PHP中文网其他相关文章!