Понимание родителя и контроллера в Tkinter __init__
Я хочу понять, что означает приведенный ниже код:
class PageOne(tk.Frame):
def __init__(self, parent, controller):
Что self
, parent
а также controller
? Какова роль и сфера применения этих инструментов здесь?
я верю self
похож на this
в Java, но какая польза от parent
а также controller
?
Позже в потоке кода я вижу:
button1 = tk.Button(self, text="Back to Home",
command=lambda: controller.show_frame(StartPage))
Уже определена функция с именем show_frame
, но почему контроллер используется для вызова этой функции?
1 ответ
Грубо говоря, оригинальный код1 пытался использовать псевдо- MVC (модель, представление и контроллер) архитектуру. Хотя без "модели" - был только "вид" (некоторые кадры) и "контроллер" (основное приложение). Следовательно, ссылка на объект контроллера. Первоначально код был написан для того, чтобы показать, как "складывать" фреймы, поэтому его реализация MVC очень поверхностная и недостаточно документированная, поскольку это не было целью примера.
Чтобы ответить на ваши конкретные вопросы:
self представляет текущий объект. Это общий первый параметр для любого метода класса. Как вы и предполагали, это похоже на Java.
parent представляет виджет, который будет выступать в качестве родителя текущего объекта. Все виджеты в tkinter, кроме корневого окна, требуют родителя (иногда его также называютмастером)
Контроллер представляет собой некоторый другой объект, который предназначен для общей точки взаимодействия для нескольких страниц виджетов. Это попытка развязать страницы. То есть каждая страница не должна знать о других страницах. Если он хочет взаимодействовать с другой страницей, например, сделать ее видимой, он может попросить контроллер сделать ее видимой.
Вы спросили:"Уже определена функция с именем show_frame, но почему контроллер используется для вызова этой функции?" Заметить, что show_frame
определяется в отдельном классе, в данном случае это основной класс программы. Это не определено в других классах. Чтобы другие классы могли вызывать его, они должны вызывать его в экземпляре основного класса. Этот экземпляр называетсяcontroller
в контексте этих других классов.
1 Примечание: даже если вы, вероятно, нашли оригинальный код в интерактивном учебном пособии, он изначально был получен из ответа на стек в потоке: переключение между двумя кадрами в tkinter