19 de mayo de 2016

51. Aplicaciones de usuario: GUIs con GTK en Python: window y applicationwindow

En general, una interfaz es el medio de contacto que un usuario establece con una máquina: una serie de botones, una línea de comandos, o, un entrono gráfico presente en una ventana cuyos elementos son gráficos (botones, etiquetas, imágenes...). A este último se le denomina GUI (graphical user interface)

¿Qué es GTK?

GTK+ (Gimp Toolkit) son una serie de bibliotecas gráficas inicialmente pensadas para la creación de interfaces gráficas de usuario. Dibujan en una ventana un conjunto de widgets (botones, etiquetas, etc.) GTK+ se puede usar en cualquier plataforma; aunque inicialmente se pensó para entornos de escritorio como GNOME (Ubuntu) puede usarse bajo Windows y bajo MAC OS.
Desarrollando software en C u otros lenguajes como Python puede usarse estas bibliotecas. Con GTK+ se pueden desarrollar software bajo varias licencias, libres y propietarias. Cuando llamamos desde un programa a la biblioteca de otra aplicación externa decimos que estamos utilizando una API de esa aplicación. Usaremos pues las APIs de GTK+
  1. Proyecto GTK
  2. GTK+ en Wikipedia.
 

Abriendo una ventana (window)

En esta aplicación llamamos a dos APIs de GTK+. La primera es la clase Aplicación "GtkApplication" y la segunda es la clase Ventana "GtkWindow". Construyendo una interfaz gráfica significa crear una aplicación en una ventana.
En el siguiente ejemplo, abriré una ventana en el S.O. Activo una clase llamada miaplicacion a la cual pertenecerá una ventana.
# -*- coding: utf-8 -*-
from gi.repository import Gtk
import sys

class miaplicacion(Gtk.Application):

    def do_activate(self):
        # Crear una ventana GTK que pertenece a la misma aplicación
        ventana = Gtk.Window(application=self)
        # Pongo un título
        ventana.set_title("¡Bienvenidos a GNOME!")
        # activo o muestro la ventana
        ventana.show_all()

# crea una instancia de la clase miaplicacion
app = miaplicacion()
# ejecuto la misma pasando los argumentos sys.argv
exit_status = app.run(sys.argv)
# Sale de la aplicación leyendo el status de la misma.
sys.exit(exit_status)
Intenta introducir en la ventana las siguientes opciones
  • set_default_size(m,n), siendo m y n en píxeles el tamaño de la ventana. Si m ó n = -1, se toma el tamaño predeterminado.
  • set_position(Gtk.WindowPosition.CENTER)
    • Los modificadores posibles son Gtk.WindowPosition.CENTER, Gtk.WindowPosition.NONE, Gtk.WindowPosition.MOUSE, Gtk.WindowPosition.CENTER_ALWAYS, Gtk.WindowPosition.CENTER_ON_PARENT
Para tener más referencias, consultar las funciones de las APIs correspondientes. GtkApplication y GtkWindow

Abriendo una ventana con menús (applicationwindow)

La ventana de ApplicationWindow es la que puede soportar GMenu. Es decir, es una ventana a la que se puede incorporar una barra de menú. Se utiliza una subclase de GtkWindow llamada GtkApplicationWindow.
# -*- coding: utf-8 -*-
from gi.repository import Gtk
import sys

# Una ApplicationWindow GTK

class miventana(Gtk.ApplicationWindow):
    # Constructor de ApplicationWindow

    def __init__(self, app):
        Gtk.Window.__init__(self, title="Welcome to GNOME", application=app)
        # también puede venir aquí win.show_all()

class miaplicacion(Gtk.Application):
    
    # Constructor de Gtk.Application
    def __init__(self):
        Gtk.Application.__init__(self)

    # al activarse la aplicación, crea un objeto miventana.
    # Paso la aplicación "self" como argumento.
    def do_activate(self):
        win = miventana(self)
        # Muestra la ventana
        win.show_all()

    # hacer un startup
    def do_startup(self):
        Gtk.Application.do_startup(self)

# al igual que antes se crea y se ejecuta la aplicación
app = miaplicacion()
exit_status = app.run(sys.argv)
sys.exit(exit_status)
Explicando el código:
  • Se vuelve a crear una clase miaplicacion, llamando a la API Gtk.Application.
  • Esta aplicación define dos métodos que se activan cuando recibe dos señales distintas (ver señales en Gtk.application).
    • Cuando la aplicación se ejecuta se dispara la señal startup antes de dibujar la ventana. Se utiliza para generar código  antes de tener la interfaz gráfica en sí.
    • Después, y dependiendo de cómo sea la aplicación se disparan las señales open o activate.
  • La clase miventana , llama a la API Gtk.Applicationwindow.
    • Simplemente se construye llamando al constructor de la clase Gtk.Window.
  • Por lo demás, es igual al código del apartado anterior.

No hay comentarios:

Publicar un comentario