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, 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: #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: #4870bc;
}
.text-button *:hover {
color: white;
}
.text-button:hover:active, .text-button:active {
background: #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: #F00;
}
#MyWindow .text-button {
background: #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!
Edit 2023: Ho sostituito background-color (non corretto) con backgroud.