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