Licence CC BY-NC-SA

Une première fenêtre, le Hello world

L’heure est arrivée. Nous allons faire notre première fenêtre. Voici à quoi elle va ressembler :

Votre toute première fenêtre GTK+ 3 et Python3

Oui, okay elle est assez simpliste et je vois déjà vos airs déçu ! Mais ne vous en faites pas, les choses vont rapidement devenir intéressantes. ;)

On commence ?

Avec l'interpréteur

Bien, ouvrez votre interpréteur Python3 et importez-y Gtk de GObject :

1
2
3
4
5
Python 3.4.3 (default, Mar 26 2015, 22:03:40) 
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from gi.repository import Gtk
>>>

Nous allons commencer par créer une fenêtre qui va contenir nos widgets.
Un widget est un élément graphique. Cela peut être un bouton, une liste déroulante, un label (un texte), une image… Et même une fenêtre ! Pour en créer une, entrez ce qui suit :

1
>>> window = Gtk.Window()

Notre objet window est désormais une fenêtre GTK. Mais celle-ci est terriblement vide et ennuyante.
Remplissons-la un peu avec un label :

1
2
>>> label = Gtk.Label('Hello, world !')
>>> window.add(label)

Enfin, et le plus important pour vous j’imagine, affichons notre fenêtre :

1
2
>>> window.show_all()
>>> Gtk.main()

Sous vos yeux ébahis s’affiche une minuscule fenêtre. Approchez-vous d’un bord pour l’agrandir. Pour la fermer, cliquez sur la croix, comme une fenêtre normale. Cependant vous devrez fermer votre interpréteur Python avec un Ctrl+z.

La boucle GTK

J’aimerais revenir sur l’instruction Gtk.main().

Une interface graphique est simplement une boucle géante qui attend patiemment que l’utilisateur fasse quelque chose. Gtk.main() lance cette boucle. Tant que celle-ci est lancée, votre programme tourne toujours.

Diagramme de la boucle Gtk.main

C’est pour ça que l’on a dû forcer l’interpréteur à se fermer, on n’a jamais indiqué à GTK+ de sortir de cette boucle.

Pour fermer cette boucle, nous devons utiliser la méthode Gtk.main_quit(). Cependant, nous souhaitons appeler cette méthode seulement quand on ferme la fenêtre, c’est à dire quand on la supprime.

Nous allons donc devoir utiliser les événements, comme ceci :

1
>>> window.connect('delete-event', Gtk.main_quit)

Ici, nous indiquons que quand l’événement delete-event est appelé, en supprimant la fenêtre par exemple, on appelle la méthode main_quit de GTK.

Je vous expliquerais plus en détail dans le prochain chapitre comment utiliser ces événements et leur fonctionnement.

Un peu d’exercice, ça vous tente ? :diable:

Un peu d'exercice

Tout d’abord, voici ce que donne notre Hello world dans un fichier hello_world.py :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env python3
# coding: utf-8

from gi.repository import Gtk

# On crée notre fenêtre principale
window = Gtk.Window()

# On crée également un label pour notre window
label = Gtk.Label('Hello, world!')

# On l'ajoute à la fenêtre
window.add(label)

# On indique que le si la fenêtre est supprimée, la boucle principale s'arrête
window.connect('delete-event', Gtk.main_quit)

# On affiche toute notre fenêtre
window.show_all()
# Et on lance la boucle principale
Gtk.main()

Nous obtenions ce résultat :

La fenêtre Hello World

Voici donc quelques défis que je vous ai concocté :

  • Créez une fenêtre qui afficherait Bonjour les zesteux!.
  • Assignez un titre à votre fenêtre.
  • Créez une fenêtre qui aurait un bouton avec comme texte Bonjour les zesteux!. Bien sûr, ce bouton ne fait rien pour le moment.

Mais comment je fais pour réaliser ces deux derniers défis ? Tu ne nous as jamais montré comment faire ça !

Héhé, justement, c’est là tout le vice de mes défis. Si vous êtes là, c’est que vous êtes habitué de Python et que vous savez chercher dans une documentation. Voilà le lien de celle de PyGObject. Mon objectif est que soyez capable de vous débrouiller en autonomie en vous laissant chercher tout seul. C’est le meilleur moyen d’apprendre surtout que lorsque l’on crée des GUI, on passe notre temps à faire des aller-retours entre notre code et celle-ci.

Voici les solutions de ces trois défis. Je vous serais reconnaissant d’essayer avant de regarder les solutions.

Créer une fenêtre qui afficherait Bonjour les zesteux!. Ce premier défi était très simple, j’espère que vous l’avez réussi.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/usr/bin/env python3
# coding: utf-8

from gi.repository import Gtk

window = Gtk.Window()

label = Gtk.Label('Bonjour les zesteux!')
window.add(label)

window.connect('delete-event', Gtk.main_quit)

window.show_all()
Gtk.main()

C’est à partir de là que ça se complique.
Assigner un titre à notre fenêtre :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/env python3
# coding: utf-8

from gi.repository import Gtk

window = Gtk.Window()
window.set_title('Un hello world')  # Fallait la trouver dans la doc celle-ci :p

label = Gtk.Label('Bonjour les zesteux!')
window.add(label)

window.connect('delete-event', Gtk.main_quit)

window.show_all()
Gtk.main()

La réponse se trouvait ici, il fallait fouiller dans la liste jusqu’à trouver la méthode set_title().

Et enfin, créer une fenêtre qui aurait un bouton avec comme texte Bonjour les zesteux! :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/env python3
# coding: utf-8

from gi.repository import Gtk

window = Gtk.Window()
window.set_title('Un hello world')

button = Gtk.Button(label='Bonjour les zesteux!')
window.add(button)

window.connect('delete-event', Gtk.main_quit)

window.show_all()
Gtk.main()

Encore une fois, il fallait chercher dans la documentation une classe qui permettrait de créer un bouton. En toute logique, la classe Gtk.Button correspondait exactement à ce que l’on voulait.


J’espère que tout c’est bien passé et que mes petits défis n’auront pas été trop douloureux. Ceux des chapitres suivants vont être bien plus simple maintenant que vous savez vous servir de la documentation.

La suite ? Comme promis, les événements.