Соединение объектов с помощью tkinter - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь освоить 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...