Home >Backend Development >Python Tutorial >How to Access StringVar Data from One Tkinter Page to Another?
You have multiple pages of widgets collecting user input in a multi-page Tkinter application. Each page is instantiated as a class in the main application, but you're facing difficulty in obtaining the value of a StringVar from a widget in one page (PageOne) in another page (PageTwo).
Utilizing the controller, you can establish communication between pages. Firstly, save a reference to the controller within each page:
<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>
Secondly, incorporate a method in the controller that retrieves a page based on its class name:
<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>
With this method, pages can access each other by calling this function and gaining a reference to the target page. Subsequently, you can access the shared members of that page, like so:
<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>
To avoid tight coupling between pages, consider storing shared data in the controller. This method allows pages to be independent of each other's internal designs:
<code class="python">class MyApp(Tk): def __init__(self): ... self.app_data = {"name": StringVar(), "address": StringVar(), ... }</code>
Modify pages to reference the controller when creating widgets:
<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>
Finally, access data from the controller, eliminating the need for get_page:
<code class="python"> def print_it(self): value = self.controller.app_data["address"].get() ...</code>
The above is the detailed content of How to Access StringVar Data from One Tkinter Page to Another?. For more information, please follow other related articles on the PHP Chinese website!