Ein kleines GTK4-Programm in Python

Do, 21. Oktober 2021, Ralf Hersel

Die meisten Gelegenheitsentwickler unter uns, die Python und GTK als GUI-Toolkit verwenden, sind vermutlich noch nicht auf der aktuellen Version GTK4 angekommen, sondern schreiben ihre Anwendungen noch auf Basis von GTK3. Zumindest bei mir ist das so. Deshalb zeigt dieser Artikel ein kleines Pythonprogramm mit GTK4.

Der Artikel richtet sich an Anfänger und Umsteiger und hat nicht den Anspruch, ein sinnvolles Programm zu entwickeln. Beim Beispiel handelt es sich lediglich um ein Mini-Programm im Hello World Stil.

Bevor es losgeht, sollte man die Voraussetzungen prüfen. Ich gehe davon aus, dass ein Python3 zur Standardinstallation in jeder aktuellen GNU/Linux-Distribution gehört, weshalb wir diesen Schritt überspringen. Weniger klar ist, ob GTK4 installiert ist. Das kann man mit diesem Befehl prüfen:

# Arch-basierte Distros:
pamac list -i | grep gtk4

#Debian-basierte Distros
dpkg -l | grep gtk4

Falls der Befehl nichts ausgibt, muss man GTK4 installieren, zum Beispiel mit:

pamac install gtk4
oder
sudo apt install libgtk-4-bin libgtk-4-common libgtk-4-dev libgtk-4-doc

Das kleine Programm sieht so aus:

Nach dem üblichen Shebang und der Angabe zum Coding in den ersten beiden Zeilen, wird das Modul PyGObject geladen (import gi), welches das Python-Binding für GTK enthält. In Zeile 5 wird Version 4 von GTK erzwungen und in Zeile 6 die GTK-Bindings aus dem Modul PyGObject geladen.

Nun geht es in Zeile 17 weiter. Dort wird ein GTK-Anwendungsobjekt erzeugt und in Zeile 18 das Ereignis 'on_activate' dem Event-Handler 'def on_activate' zugewiesen. Damit weiss das Programm, was zu tun ist, sobald die Anwendung gestartet wird: Es ruft die Funktion 'on_activate' auf und übergibt das App-Objekt.

In der Funktion (ab Zeile 8) wird das Fenster gebaut. Zuerst wird ein Fensterobjekt (win) erzeugt und mit einem Titel und einer Grösse versehen. Dann wird in Zeile 12 ein Button erzeugt und mit einem Text (label) ausgestattet. In Zeile 13 wird bestimmt, wie der Button auf das Ereignis 'clicked' reagieren soll. In diesem Fall soll das Fender geschlossen werden (win.close). Da es sich hierbei nur um einen Befehl handelt, wird eine Lambda-Funktion verwendet, anstatt eine richtige Funktion zu schreiben, was man auch hätte machen können.

Zum Schluss wird der Button auf dem Fenster platziert (Zeile 14) und das Fenster gestartet (Zeile 15).

Das kleine Programm kann im Terminal mittels 'python3 gtk4_test.py' gestartet werden und zeigt sich so:

Der Button ist als solcher kaum zu erkennen, weil er von GTK flächenfüllend im gesamten Fenster positioniert wird. Hier noch der Code zum Kopieren:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import gi
gi.require_version("Gtk", "4.0")
from gi.repository import Gtk

def on_activate(app):
    win = Gtk.ApplicationWindow(application=app)
    win.set_title("GTK4 Beispiel")
    win.set_default_size(300, 200)
    btn = Gtk.Button(label="Klick mich!")
    btn.connect('clicked', lambda x: win.close())
    win.set_child(btn)
    win.present()

app = Gtk.Application(application_id='org.gtk.Example')
app.connect('activate', on_activate)
app.run(None)

Quellen:

https://github.com/ToshioCP/Gtk4-tutorial

https://pygobject.readthedocs.io/en/latest/index.html#

https://lazka.github.io/pgi-docs/#faq.html