Pequeña duda con gtk.main() en un programa con pygtk

Rafael Villar Burke pachi en rvburke.com
Dom Feb 11 17:44:34 CET 2007


Jesus Rodriguez wrote:
> Buenas, he hecho ya bastantes programas usando pygtk, pero la parte:
>
> if __name__=="__main__":
>    instancia = clase()
>    gtk.main()
>
> Donde clase es la clase que contiene por ejemplo el XML de glade y los
> eventos y tal.
>
> se que se hace asi, todos los ejemplos lo hacen asi, instancias tu 
> clase y
> llamas a gtk.main().
>
> Pero no entiendo, que o para que sirve exactamente "gtk.main()"? es quizá
> para inicializar gtk?
gtk.main() lo que hace es ejecutar el bucle de eventos hasta que se 
llame a gtk.main_quit(). Este bucle se encarga de gestionar los eventos 
que se producen en las aplicaciones o el sistema, creando una cola de 
tareas que se han de procesar, realizándolas en orden, y avisando a los 
objetos que se hayan conectado a una señal determinada para que actúen 
en consecuencia (llama a la retrollamada y le proporciona los parámetros 
adecuados).

Es algo parecido al mecanismo que se usa en un juego de estrategia por 
turnos. Una vez que se coloca el tablero y las fichas sobre él (se 
inicializa el sistema), y se inicia el juego (se llama a gtk.main()), 
entonces cada jugador actúa por turno. Las acciones de cada jugador (el 
sistema o el usuario de la aplicación) pueden generar acontecimientos 
(señales), que, a su vez, hacen que otros participantes (controles, 
sistema) deban responder a ellos. Lo que ocurre en cada uno de esos 
acontecimientos depende de las reglas del juego y del caso concreto, y 
en una aplicación gráfica puede ser la presentación en pantalla de un 
control o la respuesta a un click sobre él. GTK+ usa las retrollamadas 
para indicar qué ha sucedido y qué información es relevante para que un 
componente de la aplicación pueda actuar en consecuencia.
> De ser así, para que sirve instanciar una clase que ni
> siquiera sirve como parametro a gtk.main(). Vamos, imagino que
> gtk.maininicializa GTK y ya se encarga de mostrar todo, pero como sabe
> el metodo
> main de gtk que tiene que inicializar la clase correcta y tal....
No lo sabe. Tú inicializas la clase al instanciarla.
> Por otro lado he visto codigo de gente que no asigna a ninguna 
> variable la
> instancia, asi:
>
> clase()
> gtk.main()
Antes de llamar a gtk.main() ya estás generando tareas/eventos , por 
ejemplo, indicando que algunos controles deben mostrarse, pero, como no 
se ha iniciado el bucle de eventos, estos no se procesan todavía. 
Siguiendo con la analogía del juego, es como si colocas las piezas en el 
tablero y está claro que, tal como están colocadas, una ficha va a 
'comerse' a otra. Hasta que no empieza el juego no pasa nada, 
simplemente puede ocurrir eso potencialmente.

Usar una clase es una forma conveniente de 'encapsular' toda la 
información relacionada con la aplicación, pero se pueden programar 
aplicaciones gráficas sin recurrir a las clases. El hecho es que, en 
cierta manera, parece que la clase es la aplicación y que los métodos 
son los comportamientos de la aplicación, pero eso no es más que una 
abstracción útil.
Por otra parte, al instanciar la clase haces que el código se interprete 
y se definan los métodos que serán llamados por el bucle de eventos 
cuando se produzca una señal y se haya registrado uno de esos métodos 
como retrollamada. Si no necesitas manejar la instancia (usando un 
nombre), ¿para qué asignarle uno?. El efecto es el mismo, simplente que 
no puedes referirte a ella. Como un objeto no se destruye hasta que 
todos aquellos otros elementos que guarden referencias a él no las hayan 
eliminado, entonces la instancia (que se ha registrado con gtk+), 
perdura mientras el sistema la necesite.
> Si, creo que toda mi duda es esa, no saber como gtk.main() sabe que 
> "clase"
> es la que lleva el gtk de mi aplicacion :P
No lo sabe, pero en la clase has registrado algunos de sus métodos como 
manejadores de señales de gtk+, y éste sabe que debe dirigirse a ellas 
cuando se produzca la señal correspondiente. Con la clase indicas qué 
elementos deseas (que pueden estar definidos o no en gtk+), y cómo 
quieres que se relacionen los elementos con gtk+.
Recuerda que en python todo el código se interpreta... así que una 
definición de una clase es algo más una simple definición, es código 
interpretado.
> Alguien sabe como funciona ? 
¿Queda algo más claro?

Saludos,

Rafael Villar Burke

 




Más información sobre la lista de distribución Python-es