tkinter y métodos de programación GUI

Afortunadamente, esto no cae dentro del "tema de discusión general", ya que me gustaría que se tratara más de resolver estos problemas de manera eficiente que un debate gigante sobre qué enfoque general para la programación de la GUI es el mejor.

Así que comencé un poco de programación GUI con tkinter y, para resumir, mi código se está volviendo bastante feo bastante rápido. Estoy tratando de crear un editor de mapas basado en mosaicos para un videojuego. Mis principales problemas parecen ser:

la incapacidad de las devoluciones de llamada para devolver valores.la imposibilidad de transferir datos entre ventanas fácilmente.

Supongo que la razón por la que veo estos problemas es porque estoy usando funciones mucho más de lo que estoy usando clases. Por ejemplo, mi ventana "cargar mosaico" se maneja de manera completamente funcional: al hacer clic en la opción de menú en la ventana principal se llama a la función que carga la nueva ventana. Desde esa ventana, creo un cuadro de diálogo de archivo abierto cuando busco la imagen, y modifico el lienzo que muestra la imagen cuando presiono la tecla Intro (para que dibuje la cuadrícula apropiada sobre la imagen). función función función.

Lo que me parece una práctica realmente mala para mí es la inclusión de argumentos adicionales para compensar. Por ejemplo, cuando creo un conjunto de mosaicos, la instancia de la clase TileSet creada debe enviarse de vuelta a la ventana principal donde se puede mostrar la información adecuada. Tengo una lista de mosaicos cargados como una variable global (incluso más mala práctica: ¡todo lo que se ocupa de mi ventana raíz está en el ámbito global! ¡Yay!), Y debido a que las funciones de devolución de llamada no devuelven valores, paso esa lista como argumento a mi función "cargar ventana de mosaico", quelueg pasa el argumento a la función de crear mosaico (llamada cuando hace clic en el botón apropiado en la ventana), donde es realmente necesario para que pueda agregar mi mosaico recién creado a la lista. Pasar argumentos a través de una función 'jerarquía' como esa parece una idea horrible. Se vuelve confuso, es horrible escribir código modular y, en general, parece innecesario.

Mi intento de solucionar el problema sería escribir una clase que represente toda la GUI y clases de ventanas personalizadas (que la clase GUI puede crear y hacer referencia) que realmente pueden almacenar datos relevantes. Eso debería solucionar los problemas con la transferencia de datos entre ventanas. Con suerte, también reduciría mi uso gratuito de las funciones lambda en las devoluciones de llamada. Pero me pregunto: ¿es esta la mejor manera? O al menos cerca? Prefiero no comenzar a reescribir y luego terminar con otro sistema que es descuidado y confuso de una manera diferente. Sé que mis métodos son malos, pero realmente no sé cuál sería el mejor enfoque. Recibo muchos consejos sobre cómo hacer cosas específicas, pero ninguno sobre cómo estructurar el programa en su conjunto. Cualquier ayuda sería muy apreciada.

Respuestas a la pregunta(1)

Su respuesta a la pregunta