(Py)GTK Tips 'n Tricks

gtk ARCO

Esta receta pretende recoger una colección sobre pequeños 'trucos' de GTK que siempre viene bien tener a mano.

GtkkTreeview

  • Desactivar los elementos seleccionados: parece intuitivo, pero la primera vez que lo buscas, te vuelves loco. Se debe hacer con un objeto GtkTreeSelection, usando el método unselect_all().
  • Ejemplo

      selection = view.get_selection()
      selection.unselect_all()
    

GtkIconView

  • Iconos de stock en IconView: resulta que el IconView es un widget un tanto especial, hasta la fecha. Es muy restrictivo en cuando al modelo que le puedes especificar y no permite usar cell_func para renderizar nuestros datos. Además, los iconos deben ser obligatoriamente pixbuf. Por tanto, si lo que tenemos es los nombres de stock de los iconos, debemos convertirlos a pixbuf antes de meterlos en el store del iconview. Para eso, podemos usar el método render_icon de gtk.Widget. Necesita como mínimo dos parámetros, el stock y el tamaño, y retorna un pixbuf listo para meter en el modelo.
  • Ejemplo

    iv = gtk.IconView()
    st = gtk.ListStore(str, gtk.gdk.Pixbuf)
    icon = iv.render_icon("gtk-file", gtk.ICON_SIZE_BUTTON)
    st.append(["un fichero", icon])
    

GtkTreeStore, GtkListStore

  • Crear el modelo con tuplas o listas: quizá en este caso, lo obvio sería utilizar el tipo tuple o list, pero si lo haces, Gtk te responde con un bonito:
  • TypeError: could not get typecode from object
    

    Así, lo más sencillo es utilizar object de Python, que se acoge a lo que le des :-).

    Ejemplo

    t = gtk.ListStore(str, object)
    t.append(["nums", (1,2,3,4,5,6,7,8,9,0)])
    

Nuevos widgets

  • PyGtk: Generalmente, hacer un nuevo widget en PyGtk es muy sencillo. Basta con crear una nueva clase que herede de otro widget y llamar al 'inicializador' adecuado, es decir, en nuestro __init__ llamamos a Gtk.WidgetDelQueHeredamos.__init__(self) y listo.
  • Ejemplo

    class MyTreeStore(gtk.TreeStore):
        def __init__(self):
            gtk.TreeStore.__init__(self)
    

Cairo

  • Redibujar sólo lo necesario: puesto que el evento expose se produce muchas veces, es interesante poder repintar sólo las zonas necesarias. Para ello, usamos clip(), que crea una zona de dibujo, enmascarando los cambios producidos fuera de esta zona.
  • Ejemplo

    # ctx es el contexto de dibujo de Cairo
    ctx.rectangle(event.area.x, event.area.y, event.area.width, event.area.height)
    ctx.clip()
    

GtkPixbuf

  • Cargar GtkPixbuf desde un buffer: a veces es útil poder renderizar una pixbuf desde datos de un streaming, o desde un socket, en lugar de usar las fuentes comunes de imágenes de gtk (ficheros, stock, etc.). Para ello, es posible usar GtkPixbufLoader, que nos permite escribir los datos poco a poco, y cuando están todos disponibles, obtener el pixbuf.
  • Ejemplo

    pbl = gtk.gdk.PixbufLoader()
    pbl.write(data)
    pbl.close()
    pixbuf = pbl.get_pixbuf()
    

PD: Se admiten nuevos Tips 'n Tricks :-D

Referencias