GTK y Python: Cambiar el estilo de una GTKLabel

Lleva siendo así prácticamente desde que implementé la GtkHeaderBar en Pimagizer, pero como habéis podido ver, recientemente uso el tema Arc, que implica tener un fondo oscuro en las barras de menús y herramientas. Y el problema surge ahí, en que los botones que tan bonitos se veían con el tema por defecto de GTK, pero cambia con un tema oscuro:

A la derecha botones con imagen en un tema GTK claro, a la derecha lo mismo pero con un tema oscuro
Claramente la diferencia está ahí…

La solución más eficaz pasa por convertir ese botón en uno normal y corriente, sin imágenes de ningún tipo, simplemente utilizando texto, y en concreto GTKLabel. Si estáis utilizando Glade o algún sistema gráfico parecido, podéis saltar a la siguiente sección.

Crear los elementos básicos

Daremos por hecho que ya tienes una ventanita corriendo con GTK, ya que el objetivo del artículo no es enseñar a utilizar los elementos de GTK, sino utilizar uno muy concreto. Aquí repasamos cómo se crea la etiqueta dentro del botón.

buttonPx = Gtk.ToggleButton()
labelPx = Gtk.Label("Px")  # Aquí va nuestro texto
buttonPx.add(labelPx)
buttonPx.show()
labelPx.show()

Un código bastante sencillito. Creamos un GtkToggleButton (hereda de GTKButton) y un objeto GTKLabel con el texto Px. Le decimos al botón que utilice la etiqueta que acabamos de crear y mostramos ambos objetos. Veamos cómo quedaría:

Los botones de la HeaderBar con etiquetas de texto pequeñas
No se parece demasiado al resultado que queremos conseguir…

Como podemos ver en la imagen, se consigue el objetivo de no usar una imagen para mostrar en los botones, pero son muy distintos de lo que teníamos antes: dos botones con el texto bien visible.

Decidiendo el estilo de la GTKLabel

Afortunadamente GTK ofrece bastantes herramientas para poder personalizar los aspectos que necesitemos, como este concretamente. Lo que estamos buscando exactamente es esto: Text Attribute Markup, que inicialmente fue desarrollada por Pango. Formalmente lo conocemos como Pango Text Attribute Markup Language. No os preocupéis demasiado: es muy parecido a HTML, así que aprender la sintaxis no será complejo.

Básicamente, la sintaxis se basa en XML al igual que HTML. Tenemos el soporte de etiquetas algo más reducido, pero las clásicas <b>, <i> o <u> las tenemos. Añade alguna más como <big>, <small>, <sup> y <sub>, permitiendo hacer cosas más complejas sin meterse con CSS. Lo interesante con las opciones viene con la etiqueta <span>, que permite una serie de opciones muy interesante, como distintas tipografías, colores o tamaños. De la que nos ocupa ahora son los tamaños, ya que los colores vendrán predefinidos por el tema GTK del usuario.

Para decidir el tamaño de nuestra etiqueta podemos utilizar medidas absolutas (píxeles, puntos, etc…) o relativas. Lo recomendable es utilizar medidas relativas, porque se adaptarán a la resolución que esté usando el usuario. Las medidas absolutas las veremos muy bien en nuestro ordenador, pero cambiará drásticamente cuando cambiemos a otro con una resolución más distinta.

Para la etiqueta <span> disponemos del atributo size=”” o font_size=””. En la documentación tenéis informacion sobre otros muchos atributos, y modos de uso, pero nos centaremos en los tamaños relativos. Disponemos de una escala de 7 tamaños, ordenadas de menor a mayor: ‘xx-small‘, ‘x-small‘, ‘small‘, ‘medium‘, ‘large‘, ‘x-large‘, ‘xx-large‘. La que aplicaremos en nuestra aplicación será la más grande, pues obtendremos el resultado similar al que conseguíamos con las imágenes.

<span size="xx-large"><b>Px</b></span>

También le ponemos la etiqueta <b> para darle más grosor a la fuente. Ahora sólo nos queda incorporarlo al código

Utilizar marcado Pango en GTKLabel

Al código de nuestra primera sección le debemos de dar unos breves retoques para poder poner lo que necesitamos. Y es que si rellenamos la etiqueta tal cual lo tenemos en el cuadro de texto anterior el usuario verá las etiquetas, que es algo que no deseamos. GTKLabel tiene un atributo que indica si se está utilizando marcado o no.

buttonPx = Gtk.ToggleButton()
labelPx = Gtk.Label("<span size="xx-large"><b>Px</b></span>")
buttonPx.add(labelPx)
buttonPx.show()
labelPx.set_use_markup(True)  # Muy Importante!!
labelPx.show()

Como vemos, la penúltima línea es la que nos dejará hacer la magia. Le estamos diciendo que aplique el marcado a esa etiqueta. Y ya, al ejecutar de nuevo nuestra aplicación tendremos el resultado que buscábamos:

Las GTKLabel de la aplicación ahora se ven adecuadamente
¡Ahora sí!

Siempre podéis consultar el resultado en directo en la versión 0.4.5 de Pimagizer.

Un saludo!

Véase: Documentación GTK | Pimagizer

0 0

Cambiando la apariecia por defecto en Ubuntu 16.04

No es mi intención hacer el típico (y ya viejo) artículo de “10 cosas a hacer después de instalar Ubuntu 16.04”, pero, hacía casi dos años que no instalaba Ubuntu en el ordenador, así que voy a hacer una pequeña excepción. Además, ya hace casi 6 meses que salió este Xenial Xerous, y casi que debería hacerlo para Yakkety Yak, pero los temas son, en cierta medida, atemporales. De cualquier manera, en casi todos los enlaces tendrás las instrucciones para poder instalarlo allí donde quieras.

Captura de Pantalla según se inicia sesión en Ubuntu
Pantalla según se inicia sesión

La excusa, como podréis adivinar por la imagen, es por la apariencia por defecto de Ubuntu. Yo entiendo que haya gente que le guste, porque esa mezcla de colores cálidos y marrones le parezca bonito, o simplemente porque es la que viene por defecto y tal: tampoco hace falta gastar tiempo en cambiarlo.

Captura de pantalla con la terminal, navegador de archivos y actualizaciones del sistema abiertos
Un poco más en detalle el tema

Yo personalmente no pertenezco a ninguno de los dos grupos. No me gusta el conformismo, y esos colores del tema Ambiance no me convencen para nada. Menos lo hacen los del tema Radiance, que por algo no viene por defecto… Así que me puse manos a la obra. He de confesar que tampoco le eché mucho tiempo, pero para la próxima, por si yo también lo necesito, dejo una serie de enlaces, paquetes y scripts por si en el futuro hace falta echar mano de ellos.

Vamos con el tema GTK. No sé si es el que todo el mundo usa ahora, hace tiempo que no veo las típicas entradas de “Muestra tu escritorio”, pero aparece muy bien valorado en Github y con un gran soporte detrás, tanto de usuarios como de distribuciones. El tema se llama Arc, y son tres variantes: Arc, Arc Dark y Arc Darker.

Diferentes versiones del tema Arc
Las tres variantes del tema Arc

He de decir que estoy muy agradecido a la comunidad que lo desarrolla, porque ofrece paquetes binarios desde repositorios para instalarlo, lo que significa que lo instalas rápidamente y tendrás actualizaciones inmediatas. Las instrucciones para el resto de sistemas están en GitHub o aquí, pero dejo los comandos para instalarlo en Ubuntu 16.04

wget http://download.opensuse.org/repositories/home:Horst3180/xUbuntu_16.04/Release.key
sudo apt-key add – < Release.key
sudo sh -c “echo ‘deb http://download.opensuse.org/repositories/home:/Horst3180/xUbuntu_16.04/ /’ >> /etc/apt/sources.list.d/arc-theme.list”
sudo apt-get update
sudo apt-get install arc-theme

Lo siguiente es el paquete de iconos. Los hay de distintas formas, colores y tipos, pero he preferido huir de los tan mainstream Numix (Ojo, el proyecto es excelente) y buscar algo que no sea taaan uniforme. Los que propongo no son tan conocidos ni probablemente tendrán ese soporte que tuvo en su momento el pack Faenza, pero me encantan. Son el pack Paper

Iconos tema paper
Iconos del tema Paper

Para instalarlo en Ubuntu:

sudo add-apt-repository ppa:snwh/pulp
sudo apt-get update
sudo apt-get install paper-icon-theme

Lo último (aunque podríamos seguir con otras cosas más detalladas como fuentes, cursores y no sé que más) es el fondo de pantalla. Esto es bastante más personal todavía. Los que ofrece Ubuntu de forma oficial en esta distro están más o menos bien, pero, nada que ver si el fondo en cuestión es propio, hecho con tu querida cámara. Así que, por si queréis imitarlo os dejo un enlace a la foto. Aunque hace tiempo la subí a Flickr con marca de agua y bajo Copyright, ahora pongo la imagen original con los mismos derechos que el blog: Creative Commons 4.0 BY – SA.

Wallpaper de la torre Foster
Wallpaper de la torre Foster

Y por si queréis algo más veraniego, dejo otro, también bajo licencia Creative Commons que, este sí, podréis descargarlo desde Flickr sin problema ninguno.

Tïtulo: On the harbour
Wallpaper veraniego – On the harbour

Un saludo, y que lo disfrutéis.

0 0

Cómo hacer funcionar un Gtk.spinner usando Pygobject (Python y Gtk)

Tras mucho tiempo buscando la solución, hoy la he encontrado en stack overflow.

Gtk.Spinner
El spinner en cuestión funcionando

Una solución simple es llamar constantemente a este código dentro de la función que queremos llevar a cabo.

while Gtk.events_pending():
    Gtk.main_iteration()

Esto a veces no es posible. Para hacerlo sin lo anterior, necesitamos usar elementos que la librería Gtk nos ofrece. La función clave que realiza esto es GObject.idle_add(callback,[args]). Aún así también necesitaremos usar elementos como los threads de python para llevar a cabo nuestro objetivo. Os dejo un ejemplo del código funcional.

# Initialize spinner
spinner.start()

def runthread():
    # FUNCION A LLEVAR A CABO: pensando()
    resultado = pensando(cerebro)
    # Función "mágica" de Gtk
    GObject.idle_add(finalizado,resultado)

def finalizado(resultado):
    # parar el spinner
    spinner.stop()
    # Join thread
    th.join()
    # Llamar al callback
    funcion_callbk(resultado)

# Call to threading
th = threading.Thread(target=runthread)
th.start()

La función callback (funcion_callback) va a ser la función que se ocupe de recibir el resultado proporcionado por la función cerebro. Este es el resultado final que deberíais tener dentro de vuestro código.

Además, a la hora de llamar a Gtk, deberemos añadir estas funciones para que estos cambios tengan efecto: GLib.threads_init() y GObject.threads_init(). Entre ellas deberemos colocar la función Gtk.main()

PD: Sí, esta ha sido la causa del retraso de la versión 0.3 de pimagizer.

Saludos 😉

0 0

Pimagizer 0.1.12 lanzado

Ayer mismo conseguí hacer una versión que iniciara sin ningún tipo de problemas desde el lanzador de aplicaciones Gnome-shell (o desde cualquier otro 🙂 ), así que subí la versión de prueba a launchpad, al repositorio “inestable”. Ya funciona bien, por lo que lo acabo de dejar para que se suba al repo adecuado. Esto quiere decir que para instalarlo necesitaremos ejecutar “sólo” estas dos líneas:

$ sudo add-apt-repository ppa:vfrico/stable && sudo apt-get update
$ sudo apt-get install pimagizer

Y ahora os dejo un vídeo, demostrando lo que hace:


0 0

Nuevo desarrollo: Pimagizer

Este desarrollo surge, al igual que Guallet, como una necesidad. Como ya estáis viendo, llevo algo de tiempo aficcionado a esto de los fondos de pantalla. Pero esto tiene un pequeño problema: las diferentes resoluciones que los ordenadores de hoy en día tienen, así como su proporción. Abrir cada imagen con El Gimp es una buena idea, pero no es precisamente un programa ligero, y abrirlo sólo para eso… También no conozco ningún “método” que te permita grabar las imágenes con un nombre de archivo determinado.

Estuve buscando un programa que fuese ligero y abriese rápido, pero a simple vista no vi nada. Me apetecía meterme en un desarrollo, y lo vi claro: un programa para redimensionar imágenes.Python image resizer: Pimagizer. Al principio iba a usar Imagemagick, pero no siempre un ordenador lo trae instalado, y para que un usuario no se “decepcione” al instalarlo, decidí usar finalmente PIL (Python Image Resizer). Como librería gráfica usa GTK+3, con PyGi (PyGTK vale sólo para 2.x).

Lo que todavía me falta por pulir un poco es el tema de mostrar la proporción que tiene. Todavía se ve el decimal que resulta de hacer el cálculo proporcional de esta imagen.

El programa está íntegramente alojado en Launchpad. Ya avisaré cuando haya nuevas versiones con novedades.

0 0

Mis proyectos: Gnhoi

Hola. Hace tiempo que llevo queriendo hablar de esto. Este es mi desarrollo de una aplicación gráfica para linux. Probablemente no mucha gente (desgraciadamente) conozca nhopkg. Este proyecto es uno creado por Jaime Gil que pretende ser el instalador universal de linux; en vez de descargarte el código fuente, te descargas el archivo .nho compilado y los desarrolladores no se rompen la cabeza y crean un .deb, .rpm, un tarball etc…

Pero el problema es que desde que se construyó nhopkg, sólo existe una aplicación gráfica para manejarlo. Y siento decirlo, pero gambas (el lenguaje de nhopkg-fe) no me gusta, me parece lento. Por eso me puse a “investigar” y decidí meterme en el proyecto de un nuevo instalador de paquetes.

Dicho programa es Gnhoi, mi proyecto actual. Está construido en python y la interfaz en glade. El por qué de no hacerlo en C es porque no tenía ni idea de compilar nada. Python me parecía (y me parece) sencillo. Además, son script (ya había trabajado con PHP antes).

Bueno, el caso es que hace algunos meses me metí a desarrollarlo, pero me perdía entre tantas líneas de código desorganizado. En cuando tuve un poco de tiempo, me puse otra vez a ello. Lo empecé desde cero. Hoy es justo cuando he conseguido instalar definitivamente un paquete .nho (al fin y al cabo esa es su utilidad). En concreto esa versión es la 0.2.0.7 Alpha (perdón por tanto cero, creo que es demasiado inmadura).

El proyecto está en sourceforge: gnhoi.sf.net. Allí subo las versiones más serias del proyecto, pero si queréis trastear con algunas otras versiones, podéis verlas en mediafire.
Además también he creado varios logos, en formatos svg y png para nhopkg y gnhoi aquí.

En cuanto a la versión 0.2.0.7 alpha: Aparte de que ahora es capaz de instalar paquetes, es capaz de reconocer el archivo introducido por argumentos. Esto permite abrir el nho directamente desde cualquier aplicación.

0 0