Итак, я пытаюсь получить кнопку на моем PageOne
(в отдельном файле), чтобы перенаправить меня на StartPage
. Однако я не могу заставить его работать. Как передать класс PageOne
на страницу StartPage
?
Код:
import tkinter as tk
from testPage import PageOne
LARGE_FONT = ('Verdana', 12) # font's family is Verdana, font's size is 12
class MainWindow(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title('cool') # set the title of the main window
self.geometry('300x300') # set size of the main window to 300x300 pixels
# this container contains all the pages
container = tk.Frame(self)
container.pack(side='top', fill = 'both', expand = True)
container.grid_rowconfigure(0, weight=1) # make the cell in grid cover the entire window
container.grid_columnconfigure(0, weight=1) # make the cell in grid cover the entire window
self.frames = {} # these are pages we want to navigate to
for F in (StartPage, PageOne): # for each page
frame = F(container, self) # create the page
self.frames[F] = frame # store into frames
frame.grid(row=0, column=0, sticky='nsew') # grid it to container
self.show_frame(StartPage) # let the first page is StartPage
def show_frame(self, name):
frame = self.frames[name]
frame.tkraise()
class StartPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text='Start Page', font=LARGE_FONT)
label.pack(pady=10, padx=10) # center alignment
button1 = tk.Button(self, text='Visit Page 1', # when click on this button, call the show_frame method to make PageOne appear
command=lambda: controller.show_frame(PageOne))
button1.pack() # pack it in
app = MainWindow()
app.mainloop()
тогда мой модуль FirstPage:
import tkinter as tk
from DashMenu import StartPage
LARGE_FONT = ('Verdana', 12)
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
label = tk.Label(self, text='Page One', font=LARGE_FONT)
label.pack(pady=10, padx=10)
button1 = tk.Button(self, text='Back to Home', # likewise StartPage
command=lambda: controller.show_frame(StartPage))
button1.pack()
Таким образом, этот метод получения этого кода возвращает этот код ошибки:
ImportError: cannot import name 'PageOne'
Я также пытался передать StartPage, parent и controller в PageOne при вызове, но я получил ошибку, возможно, я сделал это неправильно? это правильный способ сделать это?
Как правильно настроить StartPage моего импорта PageOne? и наоборот?
Обновление:
новая структура кода, которую я пробовал.
page.py
import tkinter as tk
class Page(tk.Frame):
def __init__(self, *args, **kwargs):
tk.Frame.__init__(self, *args, **kwargs)
def show(self):
self.lift()
Dashboard.py
import tkinter as tk
from pageOne import PageOne
from pageTwo import PageTwo
class MainWindow(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title('cool') # set the title of the main window
self.geometry('300x300') # set size of the main window to 300x300 pixels
# this container contains all the pages
container = tk.Frame(self)
container.pack(side='top', fill = 'both', expand = True)
container.grid_rowconfigure(0, weight=1) # make the cell in grid cover the entire window
container.grid_columnconfigure(0, weight=1) # make the cell in grid cover the entire window
self.frames = {} # these are pages we want to navigate to
for F in (PageOne, PageTwo): # for each page
frame = F(container, self) # create the page
self.frames[F] = frame # store into frames
frame.grid(row=0, column=0, sticky='nsew') # grid it to container
self.show_frame(PageOne) # let the first page is StartPage
def show_frame(self, name):
frame = self.frames[name]
frame.tkraise()
pageOne.py
import tkinter as tk
from page import Page
class PageOne(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)
print("pgone")
pageTwo.py
import tkinter as tk
from page import Page
class PageTwo(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)
поэтому я запустил приведенный выше код и, к сожалению, получил ошибки. За исключением того, что у меня нет окна вывода с какими-либо страницами, я буду продолжать искать, почему. Есть предложения?