Я реализую GUI с Tkinter, следуя этому топу c: Переключение между двумя кадрами в tkinter
Пытаюсь адаптировать его к моей проблеме:
Это контроллер:
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title('VOICED/UNVOICED SPEECH DETECTION')
self.resizable(RESIZABLE, RESIZABLE)
self.geometry(str(WIDTH_WINDOW) + 'x' + str(HEIGHT_WINDOW))
self.configure(bg=BACK_GROUND_COLOR)
self.title_font = tkfont.Font(family='Helvetica', size=18, weight="bold", slant="italic")
# the container is where we'll stack a bunch of frames
# on top of each other, then the one we want visible
# will be raised above the others
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (HomePage, MenuPage, GraphicPage):
page_name = F.__name__
frame = F(parent=container, controller=self)
self.frames[page_name] = frame
# put all of the pages in the same location;
# the one on the top of the stacking order
# will be the one that is visible.
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame("HomePage")
def show_frame(self, page_name):
'''Show a frame for the given page name'''
frame = self.frames[page_name]
frame.tkraise()
Это домашняя страница, которая показывает боковую полосу:
![enter image description here](https://i.stack.imgur.com/iyZPe.png)
И соответствующий код:
class HomePage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.bg = BACK_GROUND_COLOR
label = tk.Label(self, text="This is the start page", font=controller.title_font)
label.pack(side="top", fill="x", pady=10)
# -----------ROOT WINDOWS-------------
self.configure(bg=BACK_GROUND_COLOR)
self.position = 0
# ----------Menu Bar-------------------------
self.menu_frame = tk.Frame(master=self, height=HEIGHT_WINDOW, width=50,
borderwidth=5, relief='groove', highlightbackground="black",
highlightcolor="black", highlightthickness=1, bg=BACK_GROUND_COLOR).place(x=0, y=0)
# Menu Button
self.menu_img = tk.PhotoImage(file='frontend/Widget/icons/menu.png')
self.menu_button = tk.Button(master=self.menu_frame, image=self.menu_img,
height=25, width=25,
command=lambda: controller.show_frame("MenuPage"),
bg=BACK_GROUND_COLOR).place(x=10, y=10)
# Back Button
self.back_img = tk.PhotoImage(file='frontend/Widget/icons/back.png')
self.back_button = tk.Button(master=self.menu_frame, image=self.back_img, height=25, width=25,
bg=BACK_GROUND_COLOR).place(x=10, y=46)
# Home Button
self.home_img = tk.PhotoImage(file='frontend/Widget/icons/home.png')
self.home_button = tk.Button(master=self.menu_frame, image=self.home_img, height=25, width=25,
bg=BACK_GROUND_COLOR).place(x=10, y=82)
Когда я нажимаю кнопку меню (первая на боковой панели), я получаю опцию меню (которую я назвал MenuPage):
![enter image description here](https://i.stack.imgur.com/V7iiQ.png)
И соответствующий код:
class MenuPage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.controller = controller
self.bg = BACK_GROUND_COLOR
# --------------------------------------------------toolbar--------------------------------------
self.toolbar_frame = tk.Frame(master=self, height=70, width=WIDTH_WINDOW - 54,
borderwidth=5, relief='groove', highlightbackground="black",
highlightcolor="black",
highlightthickness=1, bg=BACK_GROUND_COLOR).place(x=51, y=0)
self.button_graphics_img = tk.PhotoImage(file='frontend/Widget/icons/graphic.png')
self.button_graphic = tk.Button(master=self, text='Test/Train',
image=self.button_graphics_img, height=25, width=25, bg=BACK_GROUND_COLOR,
command=lambda: controller.show_frame("GraphicPage")).place(x=75, y=5)
self.label_graphic = tk.Label(master=self, text='Plot Parameters',
height=0, width=12, bg=BACK_GROUND_COLOR).place(x=55, y=40)
Как видите, когда я нажимаю на кнопку меню, боковая рамка исчезает. Это связано с тем, что в MenuPage нет методов боковой панели, но при попытке поместить его также в MenuPage кнопки (стрелка назад, домой) не работают. Поэтому я не понимаю, как удерживать фиксированную боковую панель для всех моих страниц и следить за тем, чтобы кнопки выполняли свою работу.
Любые предложения будут оценены.
Заранее спасибо
ОБНОВЛЕНИЕ:
Разместив боковую панель в главном Windows, Я решил тот факт, что при открытии меню пропадала боковая панель.
Другая проблема:
Как мне сделать со стрелкой назад вернуться к предыдущему кадру? Например, если я открою другую страницу с помощью кнопки в MenuPage, а затем захочу вернуться с этой страницы на MenuPage, что мне делать? Я уже пытался переставить кнопки на странице, открытой из меню, изменив команду, чтобы открыть предыдущую страницу (поставив lambda: controller.show_frame("MenuPage")
), но не работает.