Entendiendo el padre y el controlador en Tkinter __init__

Quiero entender lo que significa el siguiente código:

class PageOne(tk.Frame): def __init__(self, parent, controller): 

¿Qué son el self , el parent y el controller ? ¿Cuál es el papel y el scope de estas herramientas aquí?

Creo que el self es similar a this en Java, pero ¿para qué sirven los parent y el controller ?

Más adelante en el flujo de código puedo ver:

 button1 = tk.Button(self, text="Back to Home", command=lambda: controller.show_frame(StartPage)) 

Ya hay una función definida llamada show_frame , pero ¿por qué se usa el controlador para llamar a esta función?

En términos generales, el código original 1 intentó utilizar una architecture pseudo- MVC (modelo, vista y controlador). Aunque sin la parte “modelo”, solo había una “vista” (algunos cuadros) y un “controlador” (la aplicación principal). Por lo tanto, la referencia a un objeto controlador. El código original fue escrito para mostrar cómo “astackr” los marcos, por lo que su implementación de MVC es muy superficial y poco documentada, ya que ese no era el punto del ejemplo.

Para responder a sus preguntas específicas:

self representa el objeto actual. Este es un primer parámetro común para cualquier método de una clase. Como sugirió, es similar a esto de Java.

parent representa un widget para actuar como el padre del objeto actual. Todos los widgets en tkinter excepto la ventana raíz requieren un padre (a veces también llamado maestro )

el controlador representa algún otro objeto que está diseñado para actuar como un punto común de interacción para varias páginas de widgets. Es un bash de desacoplar las páginas. Es decir, cada página no necesita saber acerca de las otras páginas. Si quiere interactuar con otra página, como hacer que sea visible, puede pedirle al controlador que la haga visible.

Preguntó: Ya hay una función definida llamada show_frame, pero ¿por qué se usa el controlador para llamar a esta función?” Tenga en cuenta que show_frame se define en una clase separada, en este caso la clase de progtwig principal. No está definido en las otras clases. Para que las otras clases puedan llamarlo, deben llamarlo en una instancia de la clase principal. Esa instancia se denomina controller en el contexto de estas otras clases.


1 Nota: aunque es probable que haya encontrado el código original en un tutorial en línea, originalmente provino de esta respuesta de stackoverflow: cambie entre dos marcos en tkinter