Я пытаюсь освоить tkinter в Python-3. Я прочитал несколько уроков и у меня есть рабочее окно из 4 классов. (Класс MenuBar, класс ToolBar, основной класс и класс StatusBar). Эти классы создаются из одного основного класса (MainWindow).
Я могу запустить скрипт без ошибок, но я застрял во взаимодействии между объектами. Я хотел бы запустить метод из объекта 'main', когда я выбираю что-то в объекте 'menubar'. Как правильно сделать это, или я должен изменить архитектуру скрипта, чтобы сделать это возможным? - Допустим, я хочу выполнить change_main из строки меню.
Я смотрел на статические и классовые методы, но я не знаю, как получить доступ к экземплярам. Я хотел бы иметь возможность получить доступ к «главному» экземпляру из экземпляра «menubar». Все экземпляры создаются в классе MainWindow.
РЕДАКТИРОВАНИЕ: КОД ОБНОВЛЕН
Я добавил метод контроллера в класс MainWindow и передал объект mainwindow в объект menubar. В объекте menubar метод контроллера вызывается командой command = controller.controller _
test, как указано в stovfl. Тестовый метод контроллера _
вызывает метод main * change _
main. Непосредственный вызов parent.main.change _
main не работает, поскольку главный объект создается после объекта menubar.
import tkinter as tk
class MainWindow(tk.Frame):
def __init__(self, parent):
parent.title("Application Title")
parent.geometry("500x400")
self.menubar = MenuBar(parent, controller=self)
self.toolbar = ToolBar(parent)
self.main = Main(parent)
self.statusbar = StatusBar(parent, 'status shown here...')
def controller_test(self):
self.main.change_main()
class MenuBar(tk.Frame):
def __init__(self, parent, controller=None):
menu = tk.Menu(parent)
parent.config(menu=menu)
submenu = tk.Menu(menu, tearoff=False)
menu.add_cascade(label='File', menu=submenu)
submenu.add_command(label='Test', command=controller.controller_test)
class ToolBar(tk.Frame):
def __init__(self, parent):…
class StatusBar(tk.Frame):
def __init__(self, parent, message=''):…
class Main(tk.Frame):
def __init__(self, parent):
self.main = tk.Frame(parent, bg='black')
self.main.pack(fill='both', expand=True)
label.pack()
def change_main(self, event=None):
self.main.pack_forget()
self.main = tk.Frame(self.parent, bg='blue')
self.main.pack(fill='both', expand=True)
if __name__ == '__main__':
root = tk.Tk()
MainWindow(root)
root.mainloop()