P
'
t
i
t
e
C
h
a
t
t
e
 
spacer~ COLLYWOBBLING FLUMMOXED STUMPS AROUND THE GLOBE Articles | Connexion
 
~wxPython 1/2

Précédent  
  Python  
  Suivant
 Présentation

Après une brève introduction au toolkit graphique Tkinter, voici une présentation de la librairie wxPython. Celle-ci se révèle plus agréable à programmer que Tkinter et possède certaines de ses caractéristiques les plus importantes.
 Sommaire


 Introduction

La librairie pour interfaces graphiques wxPython constitue un "wrapper" ou une liaison depuis Python vers la librairie wxWindows. wxWindows est un framework C++ gratuit destiné à la réalisation d'interfaces graphiques multi plates-formes. Nous le retrouvons ainsi pour des environnements tels que Windows 3.1/9x/2000/XP, Unix (GTK, Motif ou Lesstif) et MacOS. Au-delà des fonctionnalités d'affichage pur, wxWindows offre également des accès simplifiés à des fonctionnalités de bas niveau comme la copie de fichiers. Prévue pour un environnement de développement objet (C++), cette librairie se veut plus agréable à manipuler en Python que Tkinter. L'interface de programmation wxPython ne présente que peu de différences avec son pendant C++. Ces quelques variantes sont principalement liées à la nature même des langages, par exemple pour le retour de plusieurs valeurs depuis une méthode. Un outil de développement visuel nommé wxDesigner se trouve même disponible. Bien qu'il soit malheureusement payant, il sera susceptible d'intéresser plus d'un développeur.


 Première application

La création d'une application wxPython ressemble à s'y méprendre à la réalisation d'une application Tkinter. Néanmoins, l'approche proposée par wxPython paraîtra plus naturelle aux habitués de Swing ou de QT. Toute application wxPython comporte une boucle principale dans laquelle le programme doit entrer pour provoquer le lancement effectif de l'interface. Le listing 1 présente un exemple sommaire d'application.

La classe wxApp possède une méthode OnInit() appelée lors de l'entrée dans la boucle principale. Notre méthode conçoit ici une fenêtre vide. Pour la création d'une fenêtre, il faut fournir divers paramètres : son parent (pour la réalisation de fenêtres modales), son identifiant, et son titre. L'appel de la méthode SetTopWindow() permet de préciser que la fenêtre correspond à une fenêtre principale. Une application wxPython se termine automatiquement lorsque toutes les fenêtres principales de l'application ont été fermées.

Bien rares sont les applications faisant appel à la classe wxFrame de la sorte. Il se révèle bien plus pratique d'hériter de cette classe pour construire une interface. Le listing 2 propose une dérivée de la classe wxFrame comprenant des menus et une barre de statut. L'élaboration des menus ne pose pas de problème particulier. Toutefois, chaque élément de menu se voit associé un identificateur. Celui-ci joue un rôle particulier pour la gestion des événements de l'interface. Un élément de menu s'intègre toujours dans un menu donné par l'entremise de la méthode Append(). Le deuxième argument de cette méthode définit l'intitulé de l'élément. L'esperluette désigne la lettre qui sera employée comme accélérateur (soit la lettre soulignée dans l'interface). Enfin, le troisième argument n'est utilisé que si la fenêtre propose une barre de statut. Lorsqu'une telle barre est présente, le message précisé dans cet argument sera affiché en son sein lorsque l'on sélectionne cet élément. Les menus, contenant les éléments de menus, doivent eux-mêmes se voir placés dans une barre, spécifiés par la classe wxMenuBar. Les fenêtres wxPython intègrent toutes une méthode SetMenuBar() destinée à activer cet objet.

Nous recourons enfin à la méthode CreateStatusBar() pour afficher une barre de statut en bas de la fenêtre.


 Les événements

La majorité des toolkits graphiques exploitent des systèmes d'événements pour gérer les interactions avec les utilisateurs. Des toolkits tels que AWT font appel à un système d'écouteurs, chargés de recevoir les événements. Cela signifie qu'un type donné d'événement est toujours envoyé à une méthode portant un nom prédéfini. Le système choisi par wxPython/wxWindows s'en rapproche un peu. A chaque identificateur d'événement (les ID_*) attribué à nos menus, nous associerons une méthode de notre choix. A cet effet, wxPython comprend des méthodes intitulées EVT_*(). Celles-ci reçoivent trois arguments : le conteneur recevant l'événement, l'identificateur de l'événement à traiter et la méthode à appeler. Ainsi, pour appeler la méthode AboutBox() lorsque l'événement ID_ABOUT dans la fenêtre self se voit émis, nous rédigerons le code suivant :

EVT_MENU(self, ID_ABOUT, self.AboutBox)
       
      
JextCopier dans Jext | Jext | Plugin Codegeek
La méthode AboutBox pourra ressembler à celle-ci :

def AboutBox(self, event):
  dlg = wxMessageDialog(self, "Login:\n(C)2002 Posse Press",
                        "A Propos...", wxOK | wxICON_INFORMATION)
  dlg.ShowModal()
  dlg.Destroy()
       
      
JextCopier dans Jext
La méthode, qui reçoit en paramètre une instance de l'événement, affiche une boîte de dialogue modale, possédant un bouton "Ok" et une icône de type information. Parmi les nombreux événements possibles, nous citerons EVT_BUTTON, pour gérer les boutons, EVT_CLOSE, lorsqu'une fenêtre se ferme, EVT_MOVE, quand une fenêtre est déplacée ou encore EVT_CHAR lorsqu'une touche est pressée.


 Les composants complexes

Outre les composants classiques et relativement simples, wxPython offre de nombreux composants de qualité destinés à réaliser des opérations bien plus complexes. Le programme editor.py disponible sur le CD-Rom compagnon de ce magazine présente une extension de notre application en lui ajoutant une zone de texte éditable. Le composant utilisé, wxStyleTextCtrl, provenant du module wxPython.stc, a la capacité d'afficher du texte stylisé. A l'aide de ce composant, vous êtes en mesure de créer facilement un éditeur de code source. De plus, ce widget a le moyen d'afficher une marge, numéroter les lignes, afficher l'indentation, etc. L'éditeur SciTE comporte un composant semblable.

Il ne vous reste plus qu'à les différents exemples de cet article.



par Romain Guy
romain.guy@jext.org
http://www.jext.org
Dernière mise à jour : 14/10/2006


Précédent  
  Python  
  Suivant

 
#ProgX©2005 Mathieu GINOD - Romain GUY - Erik LOUISE