Apprendre Python et GTK 3 🐍

Version 13.1 par Mélodie le 2026/04/20 21:41

Objectifs

Il s'agit de créer une application graphique imitant l'outil language-selector-gnome disponible dans Ubuntu, qui soit lancé automatiquement dÚs la premiÚre session aprÚs une installation de antiX ou d'un de ses « respins » (nom donné par la communauté antiX aux versions dérivées, que l'on peut produire avec l'outil Snapshot, ou dans un live, avec l'outil remaster-antix.
Je suis une apprentie en matiĂšre de codage et mĂȘme de scripting, et Claude.ai, quand consultĂ©, attaque directement par une proposition de formation sur le tas. Je dois de toute façon, apprendre Ă  scripter, alors, allons-y, c'est le moment ! 👌

Entrée en matiÚre

« Python + GTK3 reste ma recommandation, pour ces raisons adaptĂ©es Ă  ta situation : »🐍

  • La syntaxe est lisible, les erreurs sont explicites
  • GTK3 en Python est trĂšs bien documentĂ© en français
  • Le code ressemblera Ă  ce que tu peux lire et comprendre progressivement
  • Avec mon aide et celle des autres IA, on peut construire ça ensemble pas Ă  pas, en commentant chaque bloc

(
)
pour la programmation : tu vas voir que Python est vraiment le meilleur point d'entrĂ©e. La syntaxe est proche du langage naturel, et avec GTK3 on manipule des objets qui ont une logique trĂšs visuelle — une fenĂȘtre, un onglet, un bouton, une liste. Rien d'abstrait. ☕

→ J'ai une question sur l'articulation entre Python et GTK3, comment cela se produit-il ?
 

L'articulation entre Python et GTK3

Alors : Python est le langage, GTK3 est la boüte à outils graphique. L'articulation entre les deux se fait via python3-gi — le "gi" signifie "GObject Introspection". C'est le pont qui permet à Python de parler à GTK3.

ConcrĂštement :

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

Ces trois lignes disent : "je veux utiliser GTK version 3, et j'importe ses composants".

Ensuite tout ce que tu vois Ă  l'Ă©cran — fenĂȘtre, onglet, bouton, liste — est un objet GTK que Python manipule. Par exemple :

fenetre = Gtk.Window()
bouton = Gtk.Button(label="Appliquer")

La logique est : Python décrit quoi afficher et quoi faire quand l'utilisateur clique, GTK3 se charge du dessin à l'écran.

C'est ça qui t'intĂ©resse comme articulation, ou tu voulais aller plus loin dans une direction prĂ©cise ? 🙂

→ c'est bien ça. Et "GObject" tu peux m'en parler en dĂ©tails ?
 

Bien sûr !

GObject est le systĂšme de base sur lequel repose toute la pile GTK. C'est une bibliothĂšque C qui apporte Ă  un langage qui n'en a pas nativement — le C — un systĂšme orientĂ© objet : des classes, de l'hĂ©ritage, des signaux.

Pourquoi ça existe ? GTK a Ă©tĂ© Ă©crit en C pour ĂȘtre lĂ©ger et portable. Mais le C ne connaĂźt pas les objets. GObject est la solution inventĂ©e par les dĂ©veloppeurs GNOME pour combler ce manque — une sorte de "couche objet" construite au-dessus du C.

Ce que GObject apporte concrĂštement :

  • Les classes et l'hĂ©ritage : un Gtk.Button hĂ©rite de Gtk.Widget qui hĂ©rite de GObject.Object. Chaque niveau ajoute des capacitĂ©s.
  • Les signaux : le mĂ©canisme qui permet de dire "quand l'utilisateur clique sur ce bouton, appelle cette fonction". C'est le cƓur de toute interface graphique GTK.
  • Les propriĂ©tĂ©s : chaque objet a des propriĂ©tĂ©s modifiables (taille, couleur, texte...).
  • La gestion mĂ©moire : GObject compte les rĂ©fĂ©rences pour savoir quand libĂ©rer la mĂ©moire.

👉 Et "Introspection" dans python3-gi ? C'est ce qui permet Ă  Python de "dĂ©couvrir" automatiquement toutes les classes et fonctions GTK sans qu'il faille tout réécrire en Python. GObject expose ses propres mĂ©tadonnĂ©es, et python3-gi les lit pour construire le pont.

Relations GObject GTK3 Python

Légende

👉 Une analogie : GObject est le fabricant de piĂšces, GTK3 est l'assembleur, et python3-gi est le traducteur qui te permet de donner tes instructions en Python. 🙂

Des questions sur un point précis ?

→ Oui une question, tu dis «Le C ne connaĂźt pas les objets» et «GObject est la solution inventĂ©e pour combler ce manque» : en quoi est-il Ă©crit ?

😄 Excellente question — et c'est lĂ  que c'est malicieux !

GObject est écrit... en C. Il simule l'orienté objet en C en utilisant des structures (struct), des pointeurs de fonctions, et des conventions strictes de nommage et d'organisation du code.

C'est du C qui fait semblant d'ĂȘtre objet — de façon trĂšs disciplinĂ©e et trĂšs rigoureuse, mais du C quand mĂȘme :

Les classes sont des structures, l'héritage est simulé en plaçant la structure parente en premier membre de la structure enfant, et les méthodes sont des fonctions dont le premier argument est toujours un pointeur vers l'objet.

C'est un tour de force d'ingĂ©nierie, et aussi la preuve que quand on n'a pas l'outil, on l'invente avec ce qu'on a. ☕ 🙂

Squelette Python GTK3 pour sélecteur de langue

Le workflow

  • Au premier dĂ©marrage de session aprĂšs installation, le programme se lance automatiquement
  • Les dĂ©marrages suivants : le programme reste disponible dans les menus, section PrĂ©fĂ©rences, mais ne se lance plus automatiquement

Dans le détail :

  • Un fichier locales-reconfiguration.desktop sous /usr/share/applications : point d'entrĂ©e permanent dans les menus
  • Un lien symbolique de ce fichier vers /etc/xdg/autostart : pour le lancement automatique au premier dĂ©marrage ## Lors des tests vĂ©rifier si un symlink dans /etc/xdg/autostart suffit Ă  lancer le programme au moment voulu
  • VĂ©rification de l'absence du rĂ©pertoire /live : si le systĂšme est en session live, le programme quitte silencieusement ; sinon il se lance
  • Le script /usr/local/bin/locales-reconfiguration.py : le programme lui-mĂȘme
  • Aux dĂ©marrages suivants : le lien symbolique n'existe plus → pas de lancement automatique 

Nous nous inspirons du programme language-selector-gnome de Ubuntu dont la description suit.

Description de ce que fait language-selector-gnome

  • Ouverture du programme sans droits particuliers
  • Affichage de la fenĂȘtre principale avec deux onglets : Langue / Formats rĂ©gionaux
  • L'utilisateur choisit sa langue dans l'onglet Langue
  • L'utilisateur choisit ses formats rĂ©gionaux dans l'onglet Formats rĂ©gionaux
  • Clic sur Appliquer Ă  tout le systĂšme : une boĂźte de dialogue demande le mot de passe administrateur
  • Le choix de l'utilisateur est validĂ© pour tout le systĂšme
  • Modification de /etc/locale.gen : seule la locale choisie reste dĂ©commentĂ©e
  • Appel Ă  /usr/sbin/locale-gen
  • Mise Ă  jour de /etc/default/locale avec les variables LC_*
  • Fermeture du programme

Description de ce que fera le programme

  • Lecture de ~/.config/locale pour dĂ©tecter la langue configurĂ©e par l'utilisateur
  • Fallback vers /etc/default/locale si ~/.config/locale est absent ou vide
  • Extraction des codes locales prĂ©sents (LANG, LC_*)
  • Affichage d'une confirmation Ă  l'utilisateur : langue dĂ©tectĂ©e, demande de mot de passe
    • Remplacement du contenu de /usr/share/i18n/SUPPORTED par le template depuis /usr/share/bento/locale.gen.template, via sudo -S via subprocess  (locale.gen.template contient la mĂȘme chose que le fichier /usr/share/i18n/SUPPORTED  mais il est entiĂšrement commentĂ©) 
  • On dĂ©commente les lignes correspondantes aux locales dĂ©tectĂ©es dans /etc/locale.gen (lequel est un lien symbolique qui pointe vers /usr/share/i18n/SUPPORTED )
  • Appel Ă  /usr/sbin/locale-gen via sudo -S via subprocess
  • Information Ă  l'utilisateur : pour configurer plusieurs langues, utiliser sudo dpkg-reconfigure locales

Workflow du lancement du programme

Premier démarrage de session aprÚs installation

  1. Un fichier locales-reconfiguration.desktop est présent sous /etc/xdg/autostart : il déclenche automatiquement le lancement à la premiÚre ouverture de session
  2. Ce fichier .desktop appelle un script bash /usr/local/bin/start-locales-reconfigurator.sh
  3. Le script bash vérifie que l'on n'est pas en session live (absence du répertoire /live), puis lance le programme Python GTK3 /usr/local/bin/locales-reconfiguration.py
  4. Python crée un fichier /tmp/locales-reconf.started pour signaler qu'il est bien démarré
  5. Le script bash détecte l'apparition de ce fichier locales-reconf.started, puis supprime /etc/xdg/autostart/locales-reconfiguration.desktop
  6. Le programme Python GTK3 se présente à l'utilisateur

Le script start-locales-reconfigurator.sh

Pour détecter l'apparition du fichier locales-reconf.started, on pourrait utiliser un simple if :

if [ -f "/tmp/locales-reconf.started" ]; then
    rm /etc/xdg/autostart/locales-reconfiguration.desktop
fi

Mais avec if, si Python dĂ©marre lentement, le test s'exĂ©cute avant que le fichier locales-reconf.started soit créé — et rien ne se passe. Le lanceur n'est pas supprimĂ©.

On utilise donc while Ă  la place : il boucle et attend patiemment l'apparition du fichier, en retestant toutes les 0,5 secondes. DĂšs que Python crĂ©e le fichier locales-reconf.started, la boucle s'arrĂȘte et le lanceur est supprimĂ©.

#!/bin/bash

# Vérification : si on est dans une session live le programme quitte en silence
if [ -d "/live" ]; then
   exit 0
fi

# Lancement du programme Python GTK3 en arriĂšre-plan
/usr/local/bin/locales-reconfiguration.py &

# Attente de l'apparition du fichier locales-reconf.started
# (signale que Python est bien démarré)
while [ ! -f "/tmp/locales-reconf.started" ]; do
    sleep 0.5
done

# Python est lancé : on supprime le lanceur automatique
rm /etc/xdg/autostart/locales-reconfiguration.desktop

Le & aprÚs la commande de lancement de Python est indispensable : sans lui, bash resterait bloqué à attendre que Python se termine et n'atteindrait jamais la boucle while. Premier plan est le comportement par défaut de bash, le signe & en fin de ligne change ce comportement en lançant la commande en arriÚre-plan.

Le ! devant -f signifie "tant que le fichier n'existe PAS" : la boucle tourne jusqu'Ă  ce que Python signale son dĂ©marrage. exit 0 dans le bloc if [ -d "/live" ] arrĂȘte immĂ©diatement le script avec un code de retour 0 : la convention Unix pour pas d'erreur, rien Ă  faire ici.

Démarrages suivants

Le fichier /etc/xdg/autostart/locales-reconfiguration.desktop n'existe plus — le programme ne se lance plus automatiquement. Il reste accessible depuis les menus, section PrĂ©fĂ©rences, via /usr/share/applications/locales-reconfiguration.desktop.

Avant une reconstruction d'image ISO

/!\ À ajouter au script dans le workflow Git  /!\ : Le script de nettoyage prĂ©-snapshot restaurera le fichier /etc/xdg/autostart/locales-reconfiguration.desktop afin que le mĂ©canisme soit intact pour le prochain utilisateur.

Préparer le squelette du script Python

L'on vérifie la présence des paquets nécessaires :  $ apt policy python3-gi python3-gi-cairo gir1.2-gtk-3.0. Cela doit retourner installé, candidat, avec les numéros de versions.