Come applicare un foglio di stile css ad un programma python gtk3

CSS-Logo-214x300

Torno a scrivere poiché solo di recente sono venuto a capo sul come applicare correttamente un foglio di stile css ad un programma GTK3 in Python.
Purtroppo nel mondo free-software spesso la documentazione è scarsa o non aggiornata, quindi spero a mio modo di contribuire con questo post alla causa.

Come riferimento ho utilizzato un blog post del 2012 e un file d’esempio su github di 4 anni fa.

Il file su github è quello più carino da provare, ha delle animazioni spostando il mouse su uno dei due pulsanti molto carine. Ecco il codice aggiornato da provare:

#!/usr/bin/python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
import sys

class MyWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Hello World")
        self.set_name('MyWindow')
        self.set_default_size(600, 300)

        self.box = Gtk.HBox()
        self.box.set_halign(Gtk.Align.CENTER)
        self.box.set_valign(Gtk.Align.CENTER)
        self.add(self.box)

        self.button1 = Gtk.Button(label="Hello")
        self.button1.connect("clicked", self.on_button1_clicked)
        self.box.pack_start(self.button1, True, True, 0)

        self.button2 = Gtk.Button(label="Goodbye")
        self.button2.connect("clicked", self.on_button2_clicked)
        self.box.pack_start(self.button2, True, True, 0)

    def on_button1_clicked(self, widget):
        print("Hello")

    def on_button2_clicked(self, widget):
        print("Goodbye")

def main(argv):

    def gtk_style():
        css = b"""
* {
    transition-property: color, background-color, border-color, background-image, padding, border-width;
    transition-duration: 1s;

    font-family: Cantarell;
    font-size: 20px;
}

window {
    background: linear-gradient(153deg, #151515, #151515 5px, transparent 5px) 0 0,
                linear-gradient(333deg, #151515, #151515 5px, transparent 5px) 10px 5px,
                linear-gradient(153deg, #222, #222 5px, transparent 5px) 0 5px,
                linear-gradient(333deg, #222, #222 5px, transparent 5px) 10px 10px,
                linear-gradient(90deg, #1b1b1b, #1b1b1b 10px, transparent 10px),
                linear-gradient(#1d1d1d, #1d1d1d 25%, #1a1a1a 25%, #1a1a1a 50%, transparent 50%, transparent 75%, #242424 75%, #242424);
    background-color: #131313;
    background-size: 20px 20px;
}

.text-button {
    color: black;
    background-color: #bbb;
    border-style: solid;
    border-width: 2px 0 2px 2px;
    border-color: #333;

    padding: 12px 4px;
}

.text-button:first-child {
    border-radius: 5px 0 0 5px;
}

.text-button:last-child {
    border-radius: 0 5px 5px 0;
    border-width: 2px;
}

.text-button:hover {
    padding: 12px 48px;
    background-color: #4870bc;
}

.text-button *:hover {
    color: white;
}

.text-button:hover:active, .text-button:active {
    background-color: #993401;
}
"""
        style_provider = Gtk.CssProvider()
        style_provider.load_from_data(css)

        Gtk.StyleContext.add_provider_for_screen(
            Gdk.Screen.get_default(),
            style_provider,
            Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
        )

    gtk_style()
    win = MyWindow()
    win.connect("delete-event", Gtk.main_quit)
    win.show_all()
    Gtk.main()

if __name__ == "__main__":
    main(sys.argv)

Come si può vedere il codice css è incorporato nel file .py, non molto pratico a dirla tutta. Meglio lasciarlo su un file a se stante e caricarlo tramite il metodo load_from_path() di Gtk.CssProvider.

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk

win = Gtk.Window()
win.set_name("MyWindow")
win.set_border_width(6)

button = Gtk.Button("Click Me")
win.add(button)

win.connect("delete-event", Gtk.main_quit)

style_provider = Gtk.CssProvider()
style_provider.load_from_path("./style.css")

Gtk.StyleContext.add_provider_for_screen(
Gdk.Screen.get_default(),
style_provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
)

win.show_all()
Gtk.main()

avendo cura di porre nella stessa directory un file con nome style.css con lo stile da voi voluto, per esempio questo:

#MyWindow {
background-color: #F00;
}

#MyWindow .text-button {
background-color: #000;
border-radius: 10px;
border-color: #000;
box-shadow: 0 0 5px #333 inset;
margin: 10px;
}

Ultimo consiglio: se volete sperimentare al volo le vostre idee applicandole al volo potete sfruttare le funzionalità di Inspector, richiamabile tramite gli shortcut tasti Control-Shift-I o Control-Shift-D. Prima però dovrete attivarlo (è disattivato di default) mediante questo comando da inserire da console:
gsettings set org.gtk.Settings.Debug enable-inspector-keybinding true

 

Spero di essere stato utile,
Enjoy!

 

 

Annunci
Questa voce è stata pubblicata in informatica, linux, mini guide e contrassegnata con , , , , , , , , . Contrassegna il permalink.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...