PyGTK 3: mini tutorial de GUI con Python + GTK+3

Vamos a hacer un pequeño programa con PyGTK 3.0 que también funciona para PyGTK 3.4. Esta pequeña GUI les enseñara como dividir un programa en dos a mas archivos.

Ustedes pueden visitar el tutorial de Sebastian Pölsterl sobre el nuevo PyGTK 3, aquí esta el nuevo tutorial, les dejo el link :

http://python-gtk-3-tutorial.readthedocs.org/en/latest/index.html

Este es el blog de Sebastian .

http://k-d-w.org/node/88

Una critica a este tutorial de Sebastian es que no enseña a dividir un programa en partes o en varios archivos, hubiera sido bueno que mostrara un ejemplo de como hacerlo con PyGTK 3.

Todos los programas grandes y complejos se dividen en muchos archivos e incluso los archivos se colocan en otros directorios, es decir se ubican en diferentes carpetas.

Comencemos con el pequeño ejemplo:

Aquí les dejo el código del escrito en un solo archivo llamado gui.py. Abrimos el editor de texto Gedit o el editor que mas usemos, copiamos el codigo de abajo y lo guardamos como gui.py

from gi.repository import Gtk

class gui():

def on_open_clicked(self, button):
print "\"Open\" button was clicked"

def on_close_clicked(self, button):
print "Closing application"
Gtk.main_quit()

def __init__(self):
self.window = Gtk.Window()
self.window.connect('delete-event', Gtk.main_quit)

self.box = Gtk.Box()
self.window.add(self.box)

self.button = Gtk.Button(label='Open')
self.button.connect("clicked", self.on_open_clicked)

self.box.pack_start(self.button, True, True, 0)

self.button = Gtk.Button(label='Cerrar')
self.button.connect("clicked", self.on_close_clicked)

self.box.pack_start(self.button, True, True, 0)

self.window.show_all()
Gtk.main()
if __name__ == '__main__':
gui = gui()

def on_open_clicked(self, button):
print "\"Open\" button was clicked"

Es una función que se activa en el terminal cuando hacemos clic en el botón open. La señal para activarla es:

self.button.connect("clicked", self.on_open_clicked)

def on_close_clicked(self, button):
print "Closing application"
Gtk.main_quit()

es una función que se activa cuando hacemos clix en el boton cerrar .

cierra el programa que ejecutamos .

la señal para activarla es

self.button.connect("clicked", self.on_close_clicked)
from gi.repository import Gtk ### invocamos a las librerías de PyGTK ###
class gui(): ### definición de clase llamada gui es la clase principal ###

Declaración de Widgets: un widgets es un programa predeterminado por las librerías de interfaz gráfica que usamos. Por ejemplo un widgets es un botón, una ventana, una caja, etc. Estos son los widgets que declaramos en nuestra programa .

self.window = Gtk.Window() ### ventana ###

self.box = Gtk.Box() ### caja ####

self.button = Gtk.Button(label='Open') #### boton open ####

self.button = Gtk.Button(label='Cerrar') #### boton cerrar ####

self.window.add(self.box) #### la caja esta contenida en la ventana llamada window ####

self.box.pack_start(self.button, True, True, 0) ##### el boton esta contenido en la caja llamada box ###
self.window.show_all() ### mostramos toda la ventana ###

gui = gui() ### creo un objeto gui ####

Colocamos nuestro programa en una carpeta llamada simple en nuestro caso en el escritorio

Abrimos la carpeta con el terminal , en mi caso uso Nemo de Linux Mint 14 .

Para compilar colocamos en el terminal python gui.py

ver la imagen .

Ahora podemos ver nuestro pequeño programa o widget nuevo creado con las librerias PyGTK 3

Se trata de una simple ventana con dos botones .

 

 

Ahora dividimos el programa en tres partes a continuación les dejo el código de los tres archivos .

Primer archivo gui.py

from gi.repository import Gtk

from destroy import destroy
from io import io

class gui(destroy ,io ):

def __init__(self):
self.window = Gtk.Window()
self.window.connect('delete-event', Gtk.main_quit)

self.box = Gtk.Box()
self.window.add(self.box)

self.button = Gtk.Button(label='Open')
self.button.connect("clicked", self.on_open_clicked)

self.box.pack_start(self.button, True, True, 0)

self.button = Gtk.Button(label='Cerrar')
self.button.connect("clicked", self.on_close_clicked)

self.box.pack_start(self.button, True, True, 0)

self.window.show_all()
Gtk.main()
if __name__ == '__main__':
gui = gui()

Segundo archivo io.py

class io:

def on_open_clicked(self, button):
print "\"Open\" button was clicked"

Tercer archivo destroy.py

from gi.repository import Gtk

class destroy:
def on_close_clicked(self, button):
print "Closing application"
Gtk.main_quit()

Colocamos los tres archivo en una misma carpeta en nuestro caso , la carpeta se llama simple dividido .

Para compilar los tres archivos . Abrimos la carpeta con el terminal y simplemente colocamos de nuevo en el terminal

python gui.py

Modificaciones realizadas al codigo gui.py

from destroy import destroy ### sentencia para importar nuestro archivo destroy.py ###
from io import io ### sentencia para importar nuestro archivo io.py ###

class gui(destroy ,io ): #### ala clase principal le añadimos las subclases destroy e io ####

Pueden observar que la sentencia

def on_open_clicked(self, button):
print "\"Open\" button was clicked"

no esta en gui.py, se encuentra en el archivo io.py

La sentencia

def on_close_clicked(self, button):

print “Closing application”
Gtk.main_quit()

se encuentra en el archivo destroy.py

Así podemos dividir un programa en muchos archivos ubicados en diferentes directorios a la vez.

Por otra parte Python es un pilar del software libre, y esta adaptado para funcionar con GTK 3.6 /3.8 su denominación es PyGTK. La adaptación de Python para KDE se denomina PyQT.

Python esta adaptado para Mac OS y WINDOWS .

Espero que les haya sido útil este mini tutorial de PyGTK3. Pueden hacer todas las criticas constructivas que quieran.

También se algo de Gtk 3.4 /3.6 y Vala GTK 3.4/3.6.

http://www.youtube.com/watch?v=9ckRn_sx8CE

Por ultimo disculpen los usuarios de KDE por no realizar un mini tutorial para KDE .


33 comentarios

  1.   Rots87 dijo

    yo en kde prefiero usa kdevelop (creo que asi se llama) para crear la gui a gusto pero aun me cuesta encontrar los procesos para que suceda x cosa :'(

  2.   St0rmt4il dijo

    Genial para los que usamos Python :D!

    Saludos!

  3.   Pablo dijo

    Hola llevo mucho tiempo siguiendo esta comunidad y no estoy muy seguro de si esta es la primera vez que comento o ya lo hice antes 😀 (no soy muy dado a escribir comentarios en la web la verdad). La cosa es que lo hago para dejar una sugerencia a Elav y KZKG^Gaara como administradores, y es que pienso que sería bueno idea añadir un plugin para coloreado de sintaxis ahora que últimamente veo más posts con código en diferentes lenguajes de programación. Se que existen bastantes plugins pero no he probado ninguno al no ser usuario de wordpress, así que os dejo que penséis en la viabilidad de las petición. Aprovecho para preguntar al resto de lectores que les parece la idea, pues se que hay por ahí gente que prefiere leer el código sin adorno alguno. Pido perdón si ya se había comentado esto por aquí y se rechazó por algún motivo, pues no recuerdo haber visto discusión sobre el tema.

    1.    marianogaudix dijo

      La verdad me gustaria tener la opcion de colorear la sintaxis para resaltar el codigo de los lenguajes de programacion .
      Eso ayudaria a los usuarios que quieran aprender los lenguajes de programacion.

      Pero bueno yo igualmente estoy comodo con el foro y que podamos discutir y aprneder entre todos .

      1.    eliotime3000 dijo

        Más cómodo es GNU Emacs, pues al menos tienes para escoger en qué corrector de lenguaje de programación quieres trabajar (si no quieres más peso para tu procesador, usa GNU Nano y disfruta del minimalismo en su máxima expresión).

        1.    marianogaudix dijo

          Elio estamos hablando de Worpress . Implementado en el blog Desde Linux. No tiene las funciones para dar color a las letras de los posteos .

          1.    eliotime3000 dijo

            Ah, disculpa.

        2.    pandev92 dijo

          Naaa emacs es cómodo para quien tiene 84 dedos XD.., la gente normal, textmate, sublimetext o notepad++ xd

          1.    eliotime3000 dijo

            Lo inverosímil es no haber aprendido mecanografía, el cual se exige para manejar bien GNU Emacs y sus atajos de teclado. Además, su GUI te facilita usar sus menús (se puede usar en Windows, pero no es recomendable hacerlo con el modo normal sino con el modo símbolo de sistema para que el win32 no boicotee tu script).

  4.   Criticón dijo

    Muy chulo el tutorial. Pero, por cierto, el código fuente de python no se compila, es un lenguaje interpretado.

    1.    Giskard dijo

      Se puede compilar a pseudo código. No es lenguaje de máquina sino bytes que representan algo para el intérprete, pero el proceso se llama compilado también. En tal sentido sí es posible decir que se compila algo.

  5.   hty dijo

    Tal vez es mejor aprender pytgk2 debido a que la ultima versión disponible para Windows es la 2.24. La serie 3 brilla por su ausencia. Y Las malas lenguas dicen que gnome rompe todas las apis en cada versión nueva.

    1.    marianogaudix dijo

      Yo programa mockup con GTK 3.4 / 3.6 y la verdad te rompen la paciencia y la cabeza , tienes que reescribir el código , ahora comprendo por que los de Linux Mint se quejan de GTK y el proyecto GNOME .
      A los de MINT les doy la razón con GTK 2.4 esto no sucedía .

  6.   Carlos dijo

    Buen tutorial y referencias.
    Sólo un detalle, ya que se ha puesto código, en Python las identaciones son obligatorias y deberías respetarse en el código de ejemplo.

    Saludos!

    1.    marianogaudix dijo

      ¿Puedes explicar en que consiste las identificaciones obligatorias en Python?.Te digo la verdad nunca habia escuchado eso .Es que estoy mal acostumbrados en los foros de PyGTK 2/3 en ingles y tal vez lo pase por alto.

      1.    Giskard dijo

        En Python no se usan llaves como en C o bloques begin/end como en Pascal sino que todo se entiende a través de la indentación que le des al código. Es decir, los bloques se reconocen por estar indentados. Es una característica que, a mí particularmente, me encanta. Se evita uno el estar escribiendo llaves y cosas así.

        1.    pandev92 dijo

          A mi justo eso no me gusta, me parece más simple poner dos llavecitas o un std::endl;, que el estar viedo si está bien tabulada la linea xd

          1.    felipe dijo

            :p te va a poner un 0 tu profe de programacion. O peor te van a despedir del trabajo. Lo que mas importa es que el codigo sea legible con todo lo que eso implica

          2.    pandev92 dijo

            acabando con con llaves de cierre, se me hace mucho más legible XD..

          3.    Giskard dijo

            En serio???


            int main(int argc, char *argv[]){program_name = argv[0];while ((argc > 1) && (argv[1][0] == '-')) {switch (argv[1][1]) {case 'v':verbose = 1; break;case 'o':out_file = &argv[1][2];break;case 'l':line_max = atoi(&argv[1][2]);break;default:fprintf(stderr,"Bad option %s\n", argv[1]);usage();}++argv;--argc;} if (argc == 1) {do_file("print.in");} else {while (argc > 1) {do_file(argv[1]);++argv;--argc;}}return (0);}

            Ves? Sin las indentaciones no se entiende muy bien. Y ese es uno fácil. Con uno más complejo sólo el compilador lo entiende. La cosa es que ya que de todas formas TIENES que indentar (para que los humanos entiendan el código) por qué habría que ser redundante y usar separadores? Basta con indentar y ya.

          4.    pandev92 dijo

            Claro que no se entiende nada, porque no estás respetando las reglas de buena escritorua de un programa en c/c++. Eso que hicistes vale para cualquier cosa, como anidar una una fncion, dentro de una función dentro otra función que está dentro de otra, luego quiero verte xd si eres capaz de entenderlo.

          5.    pandev92 dijo

            por cierto, con dos miradas, ese codigo es fácilmente entendible xD

          6.    Giskard dijo

            Eso que hice lo hice adrede para demostrarte que sin indentación, a pesar de que compila, es sumamente difícil entender cualquier código. Entonces tienes 2 reglas: Indentar y englobar con delimitadores. Pero eso es redundante. En Python un código así simplemente no es aceptado por el intérprete. Y sólo tienes una regla: Indentar. Fácil.
            Pero bueno, cada quien con sus gustos.

          7.    Atheyus dijo

            Ambos son buenos,los identados y los no identados,en mi opinión prefiero los de estilo punto y coma o como ruby,similar a python pero no es necesaria la sangria.

            Así se entiende mas :P:

            echo ‘int main(int argc, char *argv[]){program_name = argv[0];while ((argc > 1) && (argv[1][0] == ‘-‘)) {switch (argv[1][1]) {case ‘v’:verbose = 1; break;case ‘o’:out_file = &argv[1][2];break;case ‘l’:line_max = atoi(&argv[1][2]);break;default:fprintf(stderr,”Bad option %s\n”, argv[1]);usage();}++argv;–argc;} if (argc == 1) {do_file(“print.in”);} else {while (argc > 1) {do_file(argv[1]);++argv;–argc;}}return (0);}’ | perl -p -e ‘s/\{/\{\n\t/g;s/\;/\;\n\t/g;s/\t\}/\}/g;’

            Saludos 😀

      2.    Giskard dijo

        Creo que Carlos se refiere a que donde sale el código no hay indents. Eso con copy&paste simplemente no funcionará. No sé si al crear un post exista el tag para meter código de lenguajes. Sería bueno que lo pusieran si no existe.

        1.    Giskard dijo

          Ya vi cuál es el problema: el Tag CODE elimina todos los espacios y tabuladores (no debería hacer eso!!!) Pero si le ponen un nbsp entonces sí queda bien el código. A0 en hex (160 en dec) aunque creo que podría depender del font (no lo sé). Si se usa entonces sale así:

          def fib(n):
              a, b = 0, 1
              while a < n:
                  print(a)
                  a, b = b, a+b

          Que en mis pruebas se ve bien, pero no tengo un preview al postear respuestas (y debería haber eso!!!) Si no sale no es culpa mía 😉

          1.    marianogaudix dijo

            Mira los ejemplos que pone Sebastian Pölsterl en su tutorial de PyGTK 3 , Sebastian no coloca etiquetas .

            Ejemplo :

            http://python-gtk-3-tutorial.readthedocs.org/en/latest/entry.html#example

            puedes ver todo el tutorial de Sebastian .

          2.    Giskard dijo

            No sé a qué te refieres. Lo que yo digo es que acá, en los posts, no es posible usar el Tag HTML “CODE” para que lo que pongas como código y salga bien indentado. En la página que remites, si ves las fuentes de la página, verás que no usa CODE pero usa otros delimitadores HTML.
            No es contra el código que pusiste sino más bien haciendo notar una falla en el sistema de posts de este site. El cual, tal vez, puedan arreglar los admins.
            Cuando hablo de etiquetas obviamente estoy hablando de HTML, no de Python. En todo caso, si metes código sin indentar en Python simplemente no funcionará. Si viene un novato y copia el codigo tal cual aparece en este post y lo intenta correr le va a fallar. Tal vez se frustre pues es novato. Una vez más, la culpa no es tuya; y en mi respuesta inmediata anterior lo que hice fue dar una forma de solventar el problema desde el nivel de usuario-que-postea.

          3.    marianogaudix dijo

            Tenes toda la razón , tendría que haber subido fotos en vez de copiar el código .
            para mostrar como se ordenan las sentencias adecuadamente en PyGTK 3.

  7.   felipe dijo

    Para programar con python recomiendo usar el Eclipse con el plugin PyDev, o el Pychar m

  8.   Luix dijo

    Como comenteban más arriba, justo por eso no me gusta python, por el tema de las identaciones. Como bien vimos, al hacer copy&paste no funcionará, lo cual no ocurre con otros lenguajes como C, Java, PHP, etc..

    Lo de la legibilidad, aplicamos un embellecedor de códigos ( como http://indentcode.net/ ) y listo,

    Lo de feo se arregla, pero si no hay identación y la lógica se altera, sonamos..

  9.   Carlos dijo

    Soy nuevo en PyGTK, es posible interactuar con shell scripts en este lenguaje?

    1.    Hola dijo

      Gracias por el tutorial.

      Saludos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.