Midilibre.fr
Tous les blogs | Alerter le modérateur| Envoyer à un ami | Créer un Blog

13/10/2008

[pygtk] - Python débutant rajouter une interface avec Glade

Suite à notre petite mise en jambe de la dernière fois avec python, nous allons maintenant voir comment sortir de l'atmosphère de la ligne de commande pour rajouter une interface graphique à nos petits programmes. Les paquets que vous devez ajouter sont : python-gtk2 (pour l'interface entre python et gtk) et glade pour concevoir facilement des interfaces en mode visuel.
L'objectif d'aujourd'hui sera de faire une conversion euros vers dollars (on reste dans le financier, crise oblige ;-)).
De quoi avons nous besoins ? du taux de change, que nous récupérerons sur http://download.finance.yahoo.com/d/quotes.csv?s=EURUSD=X... qui nous fournira un csv (comma separated value) un fichier séparé par des virgules qui sera trés simple à exploiter.

Première étape la création de l'interface :

pugtk_glade.pngDans glade, créez une nouvelle fenêtre, et ajoutez y un conteneur de type boîte horizontal (avec 3 colonnes).
Dans la colonne de gauche créez une "saisie de texte" (dans Contrôle et affichage) pour laquelle vous donnerez le nom de 'montant_euro'. Au centre rajoutez un "label" dont le texte sera "Euros font en Dollars".

Et dans la colonne de droite, une autre saisie de texte, qui s'appelera "resultat_dollars".

Nous avons notre interface, sauvegardons là dans un dossier, sous le nom de convertisseur.glade

Deuxième étape voici venu le temps de python et de pygtk :

tout d'abord il nous faut faire les imports nécéssaire :

import gtk.glade
import urllib

nous avons bien entendu besoin de gtk.glade pour bénéficier de gtk sous python pour analyser le fichier glade que nous crée.
et nous avons besoins de urllib pour récupérer en ligne le taux de change.

le coeur du programme :

if __name__ == '__main__':

taux = urllib.urlopen('http://download.finance.yahoo.com/d/quotes.csv?s=EURUSD=X&f=sl1d1t1ba&e=.csv')
liste = taux.read().split(',')
app = window1()
gtk.main()

la première ligne est classique, elle demande à python de vérifier si le programme est bien lancé en autonome (et non pas une fonction).
nous stockons le csv dans la variable taux, qui est ensuite lu avec read() et découpé avec split(',') la virgule permet de définir ce qui sépare les éléments dans le fichier.
l'avant dernière ligne premet d'indiquer le nom de notre fenêtre (attention le nom doit correspondre à ce que vous avez mis dans glade)

Concernant la variable liste, elle est structurée de la sorte :

['"EURUSD=X"', '1.3403', '"10/10/2008"', '"5:36pm"', '1.3401', '1.3406rn']

ainsi pour récupérer le taux de change il faudra faire appel au deuxième élément de la liste avec liste[1] (on compte à partir de 0)

La création de classe de notre fenêtre :

class window1:
def __init__(self):

ui = gtk.glade.XML('convertisseur.glade')
self.main_window = ui.get_widget('window1')
self.montant_euro = ui.get_widget('montant_euro')
self.resultat_dollars = ui.get_widget('resultat_dollars')
self.montant_euro.set_text(liste[1])
self.resultat_dollars.set_text("1")
self.main_window.connect('destroy', gtk.main_quit);
self.montant_euro.connect('changed', self.modification_du_dollar);
self.main_window.show_all()

Nous créons donc notre classe, et initialisons les différents éléments avec __init__
le ui.get.widget permet de récupérer les différents éléments crée avec glade et de les stocker dans des variables.
set_text permet de régler le texte dans une zone de saisie, ainsi nous mettons 1 pour nos euros et la variable 1 de la liste récupéré chez yahoo.
le .connect permet d'indiquer ce que nous voulons faire, destroy si un appel de type fermeture sur la main_window. et 'changed' sur montant_euro permet de détecter dés que l'on change le texte et ainsi d'appeler la fonction modification_du_dollar
enfin nous affichons la fenêtre avec .show_all()

La fonction qui fait tout le travail :

def modification_du_dollar(self, widget):

try:

euros = self.montant_euro.get_text()
resultat = float(euros)*float(liste[1])
self.resultat_dollars.set_text(str(resultat))

except:

pass

donc nous avons vu que dés que vous allez modifier le texte dans la zone 'montant_euro' nous appelons la fonction modification_du_dollar, qui est en fait l'endroit ou nous allons faire le calcul par rapport au nouveau prix. Il faut donc récupérer le texte avec get_text() sur montant_euro. la valeur du dollar est dans liste[1] comme nous l'avons vu, il ne reste qu'a stocker la multiplication dans resultat. float (salut reeth) permet de convertir notre texte (string) en chiffre à virgule (flottant float). set_text permet d'affecter le resultat (en le convertissant en texte avec str (pour string)) à resultat_dollars.

Vous remarquerez que j'ai entouré ces trois ligne d'un try et d'un except, je demande en fait a python d'essayer de faire le calcul, si il n'y arrive pas (parceque yahoo n'a pas fournit le csv ou que vous avez tapez du texte dans les zones de saisie) il appelle except, à qui nous demandons de ne rien faire avec pass.

voici le résultat de notre application une fois terminé :

pygtk_convert.png

Vous trouverez l'exemple complet ici.