Py2.7: Tkinter has code for pages in separate files

I have code that opens a window and has three buttons for pages 1, 2, and 3. However, I also have four .py files (Dashboard, PageOne, PageTwo. PageThree). The toolbar will be the file that was used to launch the application. I want the code from each file to be launched / displayed only when the user clicks the corresponding button on the page.

Dashboard.py:

import Tkinter as tk import PageOne import PageTwo import PageThree class Page(tk.Frame): def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) def show(self): self.lift() class MainView(tk.Frame): def __init__(self, *args, **kwargs): tk.Frame.__init__(self, *args, **kwargs) p1 = Page1(self) p2 = Page2(self) p3 = Page3(self) buttonframe = tk.Frame(self) container = tk.Frame(self) buttonframe.pack(side="top", fill="x", expand=False) container.pack(side="top", fill="both", expand=True) p1.place(in_=container, x=0, y=0, relwidth=1, relheight=1) p2.place(in_=container, x=0, y=0, relwidth=1, relheight=1) p3.place(in_=container, x=0, y=0, relwidth=1, relheight=1) b1 = tk.Button(buttonframe, text="Page 1", command=p1.lift) b2 = tk.Button(buttonframe, text="Page 2", command=p2.lift) b3 = tk.Button(buttonframe, text="Page 3", command=p3.lift) b1.pack(side="left") b2.pack(side="left") b3.pack(side="left") p1.show() if __name__ == "__main__": root = tk.Tk() main = MainView(root) main.pack(side="top", fill="both", expand=True) root.wm_geometry("400x400") root.mainloop() 

PageOne.py:

 import Tkinter as tk import Dashboard class Page1(Page): def __init__(self, *args, **kwargs): Page.__init__(self, *args, **kwargs) label = tk.Label(self, text="This is page 1") label.pack(side="top", fill="both", expand=True) 

PageTwo.py

 import Tkinter as tk import Dashboard class Page2(Page): def __init__(self, *args, **kwargs): Page.__init__(self, *args, **kwargs) label = tk.Label(self, text="This is page 2") label.pack(side="top", fill="both", expand=True) 

PageThree.py:

 import Tkinter as tk import Dashboard class Page3(Page): def __init__(self, *args, **kwargs): Page.__init__(self, *args, **kwargs) label = tk.Label(self, text="This is page 3") label.pack(side="top", fill="both", expand=True) 

EDIT:

The error I get is:

 Traceback (most recent call last): File "C:\Users\ross.watson\Google Drive\Smart Mirror\Test\Dashboard.py", line 2, in <module> import PageOne File "C:\Users\ross.watson\Google Drive\Smart Mirror\Test\PageOne.py", line 2, in <module> import Dashboard File "C:\Users\ross.watson\Google Drive\Smart Mirror\Test\Dashboard.py", line 3, in <module> import PageTwo File "C:\Users\ross.watson\Google Drive\Smart Mirror\Test\PageTwo.py", line 4, in <module> class Page2(Page): NameError: name 'Page' is not defined 
+2
python tkinter
Sep 16 '16 at 11:12
source share
1 answer

Error messages tell you everything you need to know to fix the problem. This is a simple problem that has nothing to do with tkinter, and all that is needed to properly organize and use your code.

For example, what does Page is not defined say? This literally tells you that Page is undefined. You defined it in your main file, but use it in another file. The solution is to move the Page definition to a separate file that you can import into files that use it.

Change your files and imports to look like this:

page.py

 class Page(tk.Frame): ... 

pageOne.py

 from page import Page class PageOne(Page): ... 

pageTwo.py

 from page import Page class PageTwo(Page): ... 

pageThree.py

 from page import Page class PageThree(Page): ... 

Dashboard.py

 from pageOne import PageOne from pageTwo import PageTwo from pageThree import PageThree ... 
+2
Sep 16 '16 at 15:04
source share



All Articles