Pages: [1]   Bas de page
Imprimer
Auteur Fil de discussion: [Tuto/Python] Construire des interfaces avec Glade couplé à Pygtk  (Lu 3712 fois)
0 Membres et 1 Invité sur ce fil de discussion.
Pyroh Hors ligne
Aspirant graphiste
Administrateur
*****
Messages: 753


Voir le profil
Vive le jambon !

« 22 Août 2007, 14:31:48 »

Un petit tuto à la demande de certains d'entre vous sur glade le concepteur d'interfaces de gtk. Toujours en utilisant le python et pygtk et la version 3 de glade (oui oui la 3 pas la 2, mettez à jour).
Si vous n'avez pas de connaissances en gtk/python vous pouvez lire ma prose ça pourrait vous donner envie de vous y mettre, mais vous n'en ferez rien directement. Enfin une saine lecture ça se refuse pas, non ? Azn En plus, on fait ça aujourd'hui (et demain piscine) :

http://www.dev-fr.org/ressources/Tutos/Glade/glade1/YAHW.png
Introduction

Glade est un système de confection d'interfaces gtk relativement bien foutu et assez pratique quand on sait l'utiliser. Un programme en gtk impose de définir l'interface élément par élément et ensuite de connecter les évènements. Quand on a 4 widgets c'est pas trop compliqué, mais quand on en a 50 avec autant d'option d'ajustement ou autres c'est pas vraiment facile et le code s'en trouve bien alourdi...  Undecided
Glade est la pour remédier à tout ça, du moins au niveau de la définition des widgets, pour les connections c'est simplifié, mais y'a quand même du taf, bande de fainéants !

Voilà à quoi ressemble la bête :

http://www.dev-fr.org/ressources/Tutos/Glade/glade1/Glade_base.png

La palette vous propose tous (ou presque) les widgets dispo dans votre install.
L'inspecteur (gadget) est un navigateur qui permet de lister tous les widgets que vous rajoutez avec représentation de la parenté.
Les propriétés quand elles sont celle du widget sélectionné qu'on peut modifier à merci.

Donc si vous avez bien compris on crée les widgets avec la palette on les sélectionne avec l'inspecteur et on les modifie avec les propriétés. Remarquez que tout s'inscrit dans un sens de rotation pareil à celui des aiguilles sur une montre, c'est beau l'ergonomie. Grin

Au boulot !

On va faire un Hello World pour ne pas rompre avec l'habitude, donc en toute logique on se rue sur la palette. Vous pouvez remarquez une section Niveaux supérieurs avec dedans plein d'icônes concrètement pour le moment seule la première nous intéresse et elle s'intitule sobrement -mais  efficacement- fenêtre cliquez dessus et, oh magie, vous obtenez ça :

http://www.dev-fr.org/ressources/Tutos/Glade/glade1/Glade-win.png

Une fenêtre !... Vide ! Le tooltip du bouton ne mentait pas, mais on a l'air fin avec une fenêtre vide. Roll Eyes
Vous l'aurez compris on va mettre des choses dedans. J'entends déjà les VisualBasiqueux et autres Windeveux 'Je vois pas le quadrillage pour placer les boutons...'. Point de quadrillage malheureux ! Tout est dynamique ici et pour ce faire on utilise des containers, partout où vous avez ce fond grisâtre c'est qu'il n'y a rien...

Dirigez-vous vers les options on va devoir en modifier certaines dans l'onglet Général :
1 - Dans le champ nom mettez "MainWindow", c'est le nom du widget au sein de gtk.
2 - Dans le champ titre de la fenêtre mettez "Yet Another Hello World", c'est le titre de la fenêtre à l'exécution.
3 - Mettez non à redimensionnable, j'imagine que vous comprenez pourquoi...
4 - Pour astuce de saisie, choisissez "Boîte de dialogue" pour faire une sorte de pop-up.

Ça c'est fait, passons à l'onglet Commun :
1 - Commencez par cocher Requête de largeur et requête de hauteur, cela va nous permettre de donner une taille désirée à la fenêtre à sa création.
2 - Dans les 2 champs qui se sont ouverts mettez 240 pour la largeur et 100 pour la hauteur. Notez que vous pouvez aussi le faire dans général, mais c'est mieux de le faire là pour éviter des problèmes de compatibilité et par souci de cohérence avec un code écrit à la main (gtk.Widget.size_request)
3 - Passez visible à oui, cela permet à la fenêtre de s'afficher au lancement de la boucle gtk sans utiliser la fonction gtk.Widget.show

Voilà pour les options de la fenêtre

Ajoutons maintenant un container à cette fenêtre ! Les containers sont des widgets, vous le savez vous codez en gtk (ah bon ?). Bref, comme tout widget ils ont droit à leurs options, voyons ça. Commencez par en ajouter un, dans la section Conteneurs de la palette cliquez sur Boîte verticale, cliquez ensuite dans la zone grisée de la fenêtre qu'on a créé au préalable et mettez 2 au nombre d'éléments. Ça donne ça :

http://www.dev-fr.org/ressources/Tutos/Glade/glade1/Glade-Vbox.png

Pour les options on se cantonnera à l'onglet Général et à mettre non à homogène. Pour ceux qui ne le savent pas l'homogénéité chez gtk c'est laisser autant de place à chaque widget dans un container, je vous laisse faire les tests pour vous en rendre compte par vous même. Wink

Dans la partie supérieure nous allons ajouter un autre container mais horizontal cette fois ci. Donc on fait pareil sauf qu'on clique sur Boîte verticale sinon même nombre d'éléments et pas homogène  (oui je détaille pas vous êtes grands Wink). Allez dans l'onglet Regroupement et passez Développer et Remplir à non.

http://www.dev-fr.org/ressources/Tutos/Glade/glade1/Glade-Hbox.png

Désormais nous allons faire comme l'ergonomie de glade et tourner dans le sens horaire. laugh
Donc, en toute logique commençons par l'espace haut/gauche qui s'est créé. Nous allons y placer une petite image. Mais vous avez pas l'image et y'a pas de lien  Undecided. Pas grave dans la mesure où je l'ai pêchée dans les stocks de gtk (les plus valeureux d'entre vous l'auront remarqué, mettant à plat mon humour). Je ne me rependrai pas en explication sur les stocks de gtk, sachez juste qu'ils sont utilisables facilement dans glade.
Donc :
1 - Cliquez sur Image dans la palette et cliquez dans la partie grisée haut/gauche
2 - Passez au niveau des options, onglet Général, dans Image de base choisissez Information, magie l'image apparaît !
3 - Passons maintenant à Taille de l'icône que vous passez à 6. (je n'ai pas encore bien compris à quel constant gtk correspond quel chiffre)
4 - Dans l'onglet Regroupement maintenant vous devez passer Développer et Remplir à non pour que le widget ne prenne que la place dont il a besoin.

http://www.dev-fr.org/ressources/Tutos/Glade/glade1/Glade-pix.png

C'est beau n'est-ce pas ? Mais on est loin du but tout de même, continuons.
Pour ajouter le texte, ça n'est pas très compliqué :
1 - Cliquez sur le bouton Étiquette et placez-la dans la partie grisée haut/droite.
2 - Comme d'hab on passe aux Propriétés. Dans l'onglet Général mettez juste Encore un hello world Azn dans Étiquette.
3 - Dans l'onglet Regroupement laissez Développer à oui et passez Remplir à non.

http://www.dev-fr.org/ressources/Tutos/Glade/glade1/Glade-label.png

C'est bien beau tout ça, mais il manque les boutons, ça craint.
1 - Sélectionnez Boîte à boutons horizontale et ajoutez-la dans la partie grisée en bas (la dernière qui reste quoi) et pour le nombre d'éléments mettez-en 2 (y'en a un peu plus j'vous l'met ? Non)
2 - Dans les Propriétés générales passez Style d'agencement à Extension (testez les autres pour comprendre le fonctionnement de l'option.
Vous avez pour résultat deux parties grisées de la taille d'un bouton :

http://www.dev-fr.org/ressources/Tutos/Glade/glade1/Glade-BtnBox.png

Maintenant ajoutez un bouton dans chacune de ces parties en utilisant Bouton dans la palette. Il faut les configurer maintenant :
1 - Sélectionnez le bouton de gauche en cliquant dessus ou à l'aide de l'inspecteur (Barnaby).
2 - Dans Type édition choisissez De base et appelez-le quit_btn
3 - Au niveau Bouton de base mettez Quitter
4 - Faites pareil pour le bouton de droite, mais en choisissant Valider pour Bouton de base et ok_btn pour le nom.

http://www.dev-fr.org/ressources/Tutos/Glade/glade1/Glade-fait.png

Ça y est on a ajouté l'interface, le travail de conception graphique s'arrête la, il faut passer à la connexion des events (ou évènements)

Connexion établie Général !


Dans les propriétés vous avez surement remarqué l'onglet Signaux (non ? ben faut ouvrir les yeux). C'est celui-ci qui permet de gérer les... signaux et évènements ou events. Un truc vachement pratique est qu'il liste les events propres au widget sélectionné, pas de risque de connecter n'importe quoi n'importe comment (enfin surtout n'importe comment).

On s'y met alors ? Bien.. !
1 - Commencez par sélectionner la fenêtre et allez à l'onglet Signaux.
2 - Dans l'arbre GtkObject (oui c'est trié par héritage, pratique je vous dit) prenez destroy. Pour le gestionnaire, prenez celui qu'il vous propose : on_MainWindow_destroy

http://www.dev-fr.org/ressources/Tutos/Glade/glade1/Glade-EventWin.png

Pour ce qui est des boutons il faut s'occuper du signal clicked dans l'arbre GtkButton avec on_quit_btn_clicked et on_ok_btn_clicked respectivement.

Ca y est les signaux sont gérés, ouf, sauvegardez dans HelloAgain.glade ! On passe à la suite.

Parce qu'il faut quand même coder ?!

Eh oui il faut coder quand même, c'est le lot. Roll Eyes
Créez un fichier python dans le même répertoire que celui où vous avez enregistré HelloAgain.glade

Maintenant il faut coder, voilà un code python commenté pour bien comprendre ce qu'il se passe Azn :

Code
(python):
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
 
import gtk
import gtk.glade
 
class HelloAgain:
def __init__(self):
 
#On charge le fichier glade qui est dans le meme repertoire (j'insiste)
self.gui=gtk.glade.XML("HelloAgain.glade")
 
#Dans la foulee on chope la fenetre principale, ca sert a rien c'est pour
#montrer qu'on peut le faire c'est tout ^^
self.win=self.gui.get_widget("MainWindow")
 
#On cree un dico qui permet de connecter les events automatiquement (si, si !)
#Chaque gestionnaire cree dans glade doit etre connecte a une fonction
#si toutefois on veut que les evenements soient geres
dico = {\
#On connecte le ok_btn a la fonction self.ok_clicked en rapport a l'event "clicked"
#comme on l'a defini dans Glade quoi ^^
'on_ok_btn_clicked':self.ok_clicked,\
#Signal "destroy" de la fenetre connecte a gtk.main_quit
'on_MainWindow_destroy':gtk.main_quit,\
#Signal "clicked" de quit_btn connecte a gtk.main_quit qui comme son nom l'indique
#sort de la boucle gtk principale et du programme par la meme occasion pour nous.
'on_quit_btn_clicked':gtk.main_quit}
#Auto-connection des signaux (ca fait un peu film de SF)
self.gui.signal_autoconnect(dico)
 
#Et c'est tout :) L'interface va s'afficher avec uniquement ca, si toutefois
#MainWindow a bien visible a oui dans les options
 
def ok_clicked(self, widget):
print("Hello (again) world")
 
HelloAgain()
gtk.main()
 

Voilà vous n'avez plus qu'à le lancer pour le tester pour voir s'afficher votre première fenêtre GTK faite avec Glade. On s'en remet difficilement, la preuve j'ai même écrit un tuto. Cheesy

En espérant que cela vous ait plus et que cela vous ait été utile (tant qu'à faire Azn)

PS : Je joins les fichiers pour les fainéants

* HelloAgain.py (1.43 Ko - Téléchargé 195 fois.)
* HelloAgain.glade (4.94 Ko - Téléchargé 168 fois.)
Journalisée

Citation de: Reppa chez Yus à 4h du mat en regardant "Salut les musclés" sur AB1
Ben quoi ? Matter ça c'est comme faire du retrogaming avec une télé Cheesy
Pitt Hors ligne
Administrateur
*****
Messages: 575


Voir le profil WWW
« Réponse #1 : 22 Août 2007, 20:21:34 »

Super intéressant, merci Smiley
Par contre tu as retiré les pièces jointes ?
Journalisée
Pyroh Hors ligne
Aspirant graphiste
Administrateur
*****
Messages: 753


Voir le profil
Vive le jambon !

« Réponse #2 : 22 Août 2007, 20:45:42 »

Ah oui tien c'est quoi cette histoire  Shocked
Je les remet tout de suite
Journalisée

Citation de: Reppa chez Yus à 4h du mat en regardant "Salut les musclés" sur AB1
Ben quoi ? Matter ça c'est comme faire du retrogaming avec une télé Cheesy
Pitt Hors ligne
Administrateur
*****
Messages: 575


Voir le profil WWW
« Réponse #3 : 23 Août 2007, 09:01:09 »

Hmm pas mieux :/
Journalisée
Pyroh Hors ligne
Aspirant graphiste
Administrateur
*****
Messages: 753


Voir le profil
Vive le jambon !

« Réponse #4 : 23 Août 2007, 10:23:53 »

Ca y est j'ai réussi, il fallait supprimer les autres, ceux de l'article original.
Vous pouvez les télécharger tranquillement.
Journalisée

Citation de: Reppa chez Yus à 4h du mat en regardant "Salut les musclés" sur AB1
Ben quoi ? Matter ça c'est comme faire du retrogaming avec une télé Cheesy
EvilTroopa Hors ligne
Global Moderator
*****
Messages: 576


Voir le profil WWW
1010011010 the Number of the Beast

« Réponse #5 : 29 Août 2007, 10:02:21 »

Mmmmh c'est moi que je suis bête ou il manque le lien pour Glade?
Oui je sais, Google est mon ami, mais ça aurait été sympa de le mettre au début du tuto!

Néanmoins, ce tuto est fort intéressant, je vais sûrement tester quelques trucs avec.

Et tout ça est multiplateformes non?
Journalisée

A mushroom a day, keeps the koopas away.
Pitt Hors ligne
Administrateur
*****
Messages: 575


Voir le profil WWW
« Réponse #6 : 29 Août 2007, 11:30:09 »

Python est multiplateforme, et Glade l'est aussi Wink
Par contre, si quelqu'un trouve comment choisir la largeur/longueur des boites en utilisant des pourcentages, qu'il ne se gène pas pour expliquer, je ne trouve pas :S
Journalisée
Pyroh Hors ligne
Aspirant graphiste
Administrateur
*****
Messages: 753


Voir le profil
Vive le jambon !

« Réponse #7 : 30 Août 2007, 01:30:38 »

Tien ayant un exam demain et étant en période d'exams de rattrapage, je peux pas m'étendre trop longuement sur le sujet donc je te joins un fichier sympa, un .glade de ce que je ferais, je sais c'est pas le mieux mais je regarderai plus tard. (PS je te laisse te débrouiller avec le fichier et ce qu'il contient, je peux pas me rependre en explications, j'ai un exam dans 5h30, désolé  Undecided)

* TestAjust.glade (7.33 Ko - Téléchargé 68 fois.)
Journalisée

Citation de: Reppa chez Yus à 4h du mat en regardant "Salut les musclés" sur AB1
Ben quoi ? Matter ça c'est comme faire du retrogaming avec une télé Cheesy
Pitt Hors ligne
Administrateur
*****
Messages: 575


Voir le profil WWW
« Réponse #8 : 30 Août 2007, 11:00:15 »

Merci AnarX, et merde pour ton exam' Azn
Je regarde ça dès que j'ai 5 min, c'est sympa ! Smiley
Journalisée
Arialia Hors ligne
Elite Member
**
Messages: 862


Voir le profil
« Réponse #9 : 06 Septembre 2007, 20:23:14 »

Et bien ça y est je m'y suis lancée  Smiley

Je connaissais déjà Glade pour avoir fait "mumuse" avec lors de mes essais linuxiens, je l'avais trouvé vraiment bien .... mais j'avais pas trop compris "après" il faut dire aussi qu'à l'époque il n'y avait des docs qu'en anglais et peu de tutorials ( vers 1997 je crois Wink )

Python : je connaissais de nom mais je n'avais pas regardé sérieusement  Roll Eyes

Le tuto est bien fait bravo Anarx .... mais ( et oui désolée un petit mais Wink ) il doit être parfait pour les linuxiens mais sous windows j'ai eu quelques difficultés :
le paquetage GTK+ pour windows n'installe que la version 2 de Glade
certes les sources de Glade 3 pour windows sont disponibles mais seule la version 3.0 est disponible en binaire et non la 3.2.xx avec laquelle tu as fait ton tuto .... des différences sont perceptibles par exemple les boutons sont dépourvus d'icônes et impossible d'en mettre :s

méfiance pour l'instant avec Glade 3.0 ( sous windows ) il ne me paraît pas compatible entièrement ... l'interface est plus sympa que la 2.0 mais pour l'instant je reste avec la 2 .... sauf si quelqu'un a compilé pour windows le dernier Glade  Azn

... euh on fait comment sous windows pour intégrer une version de Glade solo à GTK+ et PyGTK ?

Ah oui ne faites pas comme moi pour PyGtk il faut bien installer

    * PyCairo
    * PyGObject
    * PyGTK
les 3 !

en tout cas merci Anarx  Wink
Journalisée

Mon blog de dev   - -  Mon tutoriel sur la libfat -- DSPhoto
Un bon programmeur est fainéant : il déteste refaire la même chose, il fait donc des fonctions Wink

Mais qui m'a mis des nounours roses ? Le rose c'est pour les homo et les gamines , beurk, mais ça va bien aux fleurs Smiley
Et aux jeux de Genevois Wink
Mollusk Hors ligne
Administrateur
*****
Messages: 3540


Voir le profil WWW
Ne vous posez pas de questions, codez !

« Réponse #10 : 06 Septembre 2007, 20:55:21 »

C'est le bon icone python que j'ai mis ?
Journalisée

Pages: [1]   Haut de page
Imprimer

Aller à: