您有多個頁面的小部件在多頁面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中文網其他相關文章!