Ткинтер есть код для страниц в отдельных файлах
У меня есть код, который открывает окно и имеет три кнопки для страницы 1, страницы 2 и страницы 3. Однако у меня также есть четыре файла.py (Dashboard, PageOne, PageTwo. PageThree). Dashboard будет файлом, который использовался для запуска приложения. Я хочу, чтобы код из каждого файла запускался / отображался только тогда, когда пользователь нажимает на кнопку соответствующей страницы.
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)
Ошибка, которую я получаю:
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
1 ответ
Сообщения об ошибках сообщают вам все, что вам нужно знать, чтобы решить проблему. Это простая проблема, которая не имеет ничего общего с tkinter, и все, что связано с правильной организацией и использованием вашего кода.
Например, что такое Page is not defined
говорю тебе? Это говорит вам, буквально, что Page
не определено. Вы определили его в своем основном файле, но вы используете его в другом файле. Решение состоит в том, чтобы переместить определение Page
в отдельный файл, который можно импортировать в файлы, которые его используют.
Измените ваши файлы и импортируйте их так:
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
...