Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
589 views
in Technique[技术] by (71.8m points)

python - Tkinter have code for pages in separate files

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

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)

Error I'm getting:

Traceback (most recent call last):
  File "C:Users
oss.watsonGoogle DriveSmart MirrorTestDashboard.py", line 2, in <module>
    import PageOne
  File "C:Users
oss.watsonGoogle DriveSmart MirrorTestPageOne.py", line 2, in <module>
    import Dashboard
  File "C:Users
oss.watsonGoogle DriveSmart MirrorTestDashboard.py", line 3, in <module>
    import PageTwo
  File "C:Users
oss.watsonGoogle DriveSmart MirrorTestPageTwo.py", line 4, in <module>
    class Page2(Page):
NameError: name 'Page' is not defined
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The error messages tell you everything you need to know in order to fix the problem. This is a simple problem that has nothing to do with tkinter, and everything to do with properly organizing and using your code.

For example, what is Page is not defined telling you? It's telling you, quite literally, that Page is not defined. You defined it in your main file, but you're using it in another file. The solution is to move the definition of Page to a separate file that can be imported into the files that use it.

Modify 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
...

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...