Python has no native support for GUI (Graphical User Interface) programming, but this isn’t a problem since many GUI libraries written in other languages can be used by Python programmers. This is possible because many GUI libraries have Python wrappers or bindings; these are packages and modules that are imported and used like any other Python packages and modules but which access functionality that is in non-Python libraries under the hood.
Mark Summerfield: Programming in Python 3.
Vero, & peccato perché un’interfaccia grafica a volte torna molto comoda (e gli utenti la pretendono). Finora io ero un fedele seguace della chiesa di wxPython, è facile, completo, funziona.
Ma con un grosso limite: vale solo per la versione 2.x di Python. C’è il progetto Phoenix ma mi sembra fermo da chissà quando.
Forse è il caso di vedere qualcos’altro. Ecco allora GTK+ 3, non è detto che poi sia lui ma voglio provarlo, raccontandolo qui nel blog.
Ho una guida, The Python GTK+ 3 Tutorial di Sebastian Pölsterl.
Ah! una nota: sì per tante cose si continua a usare la versione 2.x di Python ma prima o poi…
Uh! un’altra nota: GTK lo trovate installato, con Python, almeno per Ubuntu; quindi niente spiegone per l’installazione.
E siamo così arrivati al capitolo 2 dove abbiamo il primo esempio, creare una finestra vuota (se.py):
#!/usr/bin/python3 # non c'è più bisogno di dire di usare UTF-8 from gi.repository import Gtk win = Gtk.Window() #crea la finestra win.connect('delete_event', Gtk.main_quit) # attiva la chiusura dell'app win.show_all() # visualizza Gtk.main() # avvia il loop di Gtk+
Siccome il codice è ampiamente commentato (contrariamente alle mie abitudini) devo solo rimarcare che per adesso la shebang è così, fa riferimento a Python 3. Notare inoltre che finalmente non devo più dire di usare l’UTF-8 per i caratteri non ascii (la seconda riga è messa lì per questo).
Una cosa: modificando le prime due righe così:
#!/usr/bin/python
# ci sarebbe ancora bisogno di dire di usare UTF-8
funziona con la versione 2, provare per credere.
Il passo successivo è di far fare qualcosa all’applicazione, ecco Hello World! (hw.py):
#!/usr/bin/python3 #hw.py from gi.repository import Gtk class MyWindow(Gtk.Window): def __init__(self): Gtk.Window.__init__(self, title = "Hello World!") self.button = Gtk.Button(label = "Click Here") self.button.connect("clicked", self.on_button_clicked) self.add(self.button) def on_button_clicked(self, widget): print('Hello World!') win = MyWindow() win.connect('delete_event', Gtk.main_quit) win.show_all() Gtk.main()
Cose nuove: ho derivato la classe MyWindow
da Gtk.Window
, nel costruttore ho chiamato quello della classe madre, approfittandone per definire il titolo. Ho poi definito e visualizzato il pulsante button
, collegando il messaggio clicked
al metodo on.button_clicked()
, definito subito dopo. Il resto è come nell’esempio precedente, con la differenza che l’istanza è a MyWindow
invece di Gtk.Window
.
OK, fine del capitolo, bravo Sebastian, tutto chiaro. E dalla prossima volta basta con queste spiegazioni elementari, neanche fossi un padano 😉