wxPython - Guide rapide
wxPython est un wrapper Python pour wxWidgets(qui est écrit en C ++), une boîte à outils d'interface graphique multiplateforme populaire. Développé par Robin Dunn avec Harri Pasanen, wxPython est implémenté en tant que module d'extension Python.
Tout comme wxWidgets, wxPython est également un logiciel gratuit. Il peut être téléchargé sur le site officielhttp://wxpython.org. Les binaires et le code source de nombreuses plates-formes de système d'exploitation sont disponibles en téléchargement sur ce site.
Les principaux modules de l'API wxPython incluent un module principal. Cela consiste enwxObjectclass, qui est la base de toutes les classes de l'API. Le module de contrôle contient tous les widgets utilisés dans le développement d'applications GUI. Par exemple, wx.Button, wx.StaticText (analogue à une étiquette), wx.TextCtrl (contrôle de texte modifiable), etc.
L'API wxPython a un module GDI (Graphics Device Interface). C'est un ensemble de classes utilisées pour dessiner sur des widgets. Des classes comme la police, la couleur, le pinceau, etc. en font partie. Toutes les classes de fenêtre conteneur sont définies dans le module Windows.
Le site officiel de wxPython héberge également Project Phoenix - une nouvelle implémentation de wxPython pour Python 3. *. Il se concentre sur l'amélioration de la vitesse, de la maintenabilité et de l'extensibilité. Le projet a débuté en 2012 et est toujours en phase bêta.
les fenêtres
Les binaires prédéfinis pour le système d'exploitation Windows (32 bits et 64 bits) sont disponibles sur http://www.wxpython.org/download.phppage. Les dernières versions des installateurs disponibles sont - wxPython3.0-win32-3.0.2.0-py27.exe pour Python 2.7 32 bits wxPython3.0-win64-3.0.2.0-py27.exe pour Python 2.7 64 bits
La démo wxPython, les exemples et la documentation wxWidgets sont également disponibles en téléchargement sur la même page.
wxPython3.0-win32-docs-demos.exe
Linux
Les binaires wxPython pour de nombreuses distributions Linux peuvent être trouvés dans leurs référentiels respectifs. Les gestionnaires de paquets correspondants devront être utilisés pour télécharger et installer. Par exemple, sur Debian Linux, la commande suivante devrait pouvoir installer wxPython.
sudo apt-get install python-wxgtk3.0
MacOS
Des binaires prédéfinis pour MacOS sous forme d'images disque sont disponibles sur la page de téléchargement du site officiel.
Une application GUI simple affichant un message Hello World est créée en suivant les étapes suivantes:
Importez le module wx.
Définissez un objet de la classe Application.
Créez une fenêtre de niveau supérieur en tant qu'objet de la classe wx.Frame. Les paramètres de légende et de taille sont donnés dans le constructeur.
Bien que d'autres contrôles puissent être ajoutés dans l'objet Frame, leur disposition ne peut pas être gérée. Par conséquent, placez un objet Panel dans le cadre.
Ajoutez un objet StaticText pour afficher «Hello World» à une position souhaitée dans la fenêtre.
Activez la fenêtre frame par la méthode show ().
Entrez dans la boucle d'événements principale de l'objet Application.
import wx
app = wx.App()
window = wx.Frame(None, title = "wxPython Frame", size = (300,200))
panel = wx.Panel(window)
label = wx.StaticText(panel, label = "Hello World", pos = (100,50))
window.Show(True)
app.MainLoop()
Le code ci-dessus produit la sortie suivante -
wxFrame objectest la fenêtre de niveau supérieur la plus couramment utilisée. Il est dérivé dewxWindow class. Un cadre est une fenêtre dont la taille et la position peuvent être modifiées par l'utilisateur. Il a une barre de titre et des boutons de contrôle. Si nécessaire, d'autres composants tels que la barre de menus, la barre d'outils et la barre d'état peuvent être activés. Une fenêtre wxFrame peut contenir n'importe quel cadre qui n'est pas une boîte de dialogue ou un autre cadre.
Créer une bonne interface graphique par codage manuel peut être fastidieux. Un outil de conception graphique graphique est toujours pratique. De nombreux IDE de développement GUI ciblés sur wxPython sont disponibles. Voici quelques-uns d'entre eux -
- wxFormBuilder
- wxDesigner
- wxGlade
- BoaConstructor
- gui2py
wxFormBuilderest un constructeur d'interface graphique WYSIWYG multiplateforme open source qui peut traduire la conception de l'interface graphique wxWidget au format C ++, Python, PHP ou XML. Une brève introduction à l'utilisation de wxFormBuilder est donnée ici.
Tout d'abord, la dernière version de wxFormBuilder doit être téléchargée et installée à partir de http://sourceforge.net/projects/wxformbuilder/. A l'ouverture de l'application, un nouveau projet avec une zone grise vierge au centre apparaît.
Donnez un nom approprié au projet et choisissez Python comme langage de génération de code. Cela se fait dans la fenêtre des propriétés de l'objet comme indiqué dans l'image suivante -
Ensuite, dans l'onglet «Formulaires» de la palette des composants, choisissez Cadre.
Ajoutez un wxBoxSizer vertical à partir de l'onglet «Layouts».
Ajoutez les contrôles nécessaires dans la boîte avec les légendes appropriées. Ici, un StaticText (étiquette), deux objets TextCtrl (zones de texte) et un objet wxButton sont ajoutés. Le cadre ressemble à l'image suivante -
Activez Expand et Stretch sur ces trois contrôles. Dans les propriétés de l'objet pour l'objet wxButton, affectez une fonction findquare () à l'événement OnButtonClick.
Enregistrez le projet et appuyez sur F8 pour générer du code Python pour l'interface graphique développée. Laissez le fichier généré être nommé Demo.py
Dans le script Python exécutable, importez demo.py et définissez la fonction FindSquare (). Déclarez l'objet Application et démarrez une boucle d'événement principal. Voici le code exécutable -
import wx
#import the newly created GUI file
import demo
class CalcFrame(demo.MyFrame1):
def __init__(self,parent):
demo.MyFrame1.__init__(self,parent)
def FindSquare(self,event):
num = int(self.m_textCtrl1.GetValue())
self.m_textCtrl2.SetValue (str(num*num))
app = wx.App(False)
frame = CalcFrame(None)
frame.Show(True)
#start the applications
app.MainLoop()
Le code ci-dessus produit la sortie suivante -
L'original wxWidgets (écrit en C ++) est une énorme bibliothèque de classes. Les classes GUI de cette bibliothèque sont portées vers Python avec le module wxPython, qui essaie de refléter la bibliothèque wxWidgets d'origine aussi proche que possible. Ainsi, la classe wx.Frame dans wxPython agit de la même manière que la classe wxFrame dans sa version C ++.
wxObject est la base de la plupart des classes. Un objet de wxApp (wx.App dans wxPython) représente l'application elle-même. Après avoir généré l'interface graphique, l'application entre dans une boucle d'événements par la méthode MainLoop (). Les diagrammes suivants décrivent la hiérarchie des classes des classes GUI les plus couramment utilisées incluses dans wxPython.
SN | Classes et description |
---|---|
1 | wx.Frame wx.Frame Class a un constructeur par défaut sans arguments. |
2 | wx.Panel La classe wx.Panel est généralement placée dans un objet wxFrame. Cette classe est également héritée de la classe wxWindow. |
3 | wx.StaticText L'objet de classe wx.StaticText présente un contrôle contenant ce texte en lecture seule. Il peut être qualifié de contrôle passif car il ne produit aucun événement. |
4 | TexteCtrl Dans wxPython, un objet de la classe wx.TextCtrl sert cet objectif. C'est un contrôle dans lequel le texte peut être affiché et édité. |
5 | RadioButton et RadioBox Chaque bouton, un objet de la classe wx.RadioButton porte une étiquette de texte à côté d'un bouton rond. L'API wxPython comprend également la classe wx.RadioBox. Son objet offre une bordure et une étiquette au groupe. |
6 | wx.CheckBox Une case à cocher affiche une petite case rectangulaire étiquetée. Lorsque vous cliquez dessus, une coche apparaît à l'intérieur du rectangle pour indiquer qu'un choix est fait. |
sept | ComboBox et classe de choix Un objet wx.ComboBox présente une liste d'éléments à sélectionner. Il peut être configuré pour être une liste déroulante ou avec un affichage permanent. L'API wxPython contient une classe wx.Choice, dont l'objet est également une liste déroulante, qui est en permanence en lecture seule. |
8 | Jauge Wx. L'objet de classe Wx.Gauge affiche une barre verticale ou horizontale, qui montre graphiquement la quantité incrémentée. |
9 | wx.Slider L'API wxPython contient la classe wx.Slider. Il offre la même fonctionnalité que celle de Scrollbar. Slider offre un moyen pratique de gérer le glissement de la poignée par le classeur d'événements wx.EVT_SLIDER spécifique au curseur. |
dix | wx.MenuBar Une barre horizontale juste en dessous de la barre de titre d'une fenêtre de niveau supérieur est réservée pour afficher une série de menus. C'est un objet de la classe wx.MenuBar dans l'API wxPython. |
11 | wx.Toolbar Si le paramètre de style de l'objet wx.Toolbar est défini sur wx.TB_DOCKABLE, il devient ancrable. Une barre d'outils flottante peut également être construite à l'aide de la classe AUIToolBar de wxPython. |
12 | Wx.Dialog Bien qu'un objet de classe Dialog ressemble à un cadre, il est normalement utilisé comme une fenêtre contextuelle au-dessus d'un cadre parent. L'objectif d'une boîte de dialogue est de collecter certaines données de l'utilisateur et de les envoyer à la trame parent. |
13 | wx.Notebook Le widget wx.Notebook présente un contrôle à onglets. Un objet Notebook dans un cadre possède un ou plusieurs onglets (appelés Pages), chacun d'eux ayant un panneau affichant la disposition des contrôles. |
14 | wx.SplitterWindow L'objet de cette classe est un gestionnaire de mise en page, qui contient deux sous-fenêtres dont la taille peut être modifiée dynamiquement en faisant glisser les limites entre elles. Le contrôle Splitter donne une poignée qui peut être déplacée pour redimensionner les contrôles. |
15 | HTMLWindow La bibliothèque wxHTML contient des classes pour analyser et afficher le contenu HTML. Bien que ce ne soit pas destiné à être un navigateur complet, l'objet wx.HtmlWindow est un visualiseur HTML générique. |
16 | ListBox et ListCtrl Un widget wx.ListBox présente une liste déroulante verticalement de chaînes. Par défaut, un seul élément de la liste est sélectionnable. Le widget ListCtrl est un outil d'affichage et de sélection de liste hautement amélioré. La liste de plus d'une colonne peut être affichée dans la vue Rapport, la vue Liste ou la vue Icône. |
Contrairement à une application en mode console, qui est exécutée de manière séquentielle, une application basée sur l'interface graphique est pilotée par les événements. Les fonctions ou méthodes sont exécutées en réponse aux actions de l'utilisateur comme cliquer sur un bouton, sélectionner un élément de la collection ou cliquer avec la souris, etc., appelés événements.
Les données relatives à un événement qui a lieu pendant l'exécution de l'application sont stockées en tant qu'objet d'une sous-classe dérivée de wx.Event. Un contrôle d'affichage (tel que Button) est la source d'un événement d'un type particulier et produit un objet de la classe Event qui lui est associé. Par exemple, un clic sur un bouton émet un wx.CommandEvent. Ces données d'événement sont distribuées à la méthode de gestionnaire d'événements dans le programme. wxPython a de nombreux classeurs d'événements prédéfinis. UnEvent binder encapsule la relation entre un widget spécifique (contrôle), son type d'événement associé et la méthode du gestionnaire d'événements.
Par exemple, pour appeler OnClick() method du programme sur l'événement de clic d'un bouton, la déclaration suivante est requise -
self.b1.Bind(EVT_BUTTON, OnClick)
Bind() methodest hérité par tous les objets d'affichage de la classe wx.EvtHandler. EVT_.BUTTON ici est le classeur, qui associe l'événement de clic de bouton à la méthode OnClick ().
Exemple
Dans l'exemple suivant, le MoveEvent, provoqué en faisant glisser la fenêtre de niveau supérieur - un objet wx.Frame dans ce cas - est connecté à OnMove() methoden utilisant le classeur wx.EVT_MOVE. Le code affiche une fenêtre. S'il est déplacé à l'aide de la souris, ses coordonnées instantanées sont affichées sur la console.
import wx
class Example(wx.Frame):
def __init__(self, *args, **kw):
super(Example, self).__init__(*args, **kw)
self.InitUI()
def InitUI(self):
self.Bind(wx.EVT_MOVE, self.OnMove)
self.SetSize((250, 180))
self.SetTitle('Move event')
self.Centre()
self.Show(True)
def OnMove(self, e):
x, y = e.GetPosition()
print "current window position x = ",x," y= ",y
ex = wx.App()
Example(None)
ex.MainLoop()
Le code ci-dessus produit la sortie suivante -
position actuelle de la fenêtre x = 562 y = 309
position actuelle de la fenêtre x = 562 y = 309
position actuelle de la fenêtre x = 326 y = 304
position actuelle de la fenêtre x = 384 y = 240
position actuelle de la fenêtre x = 173 y = 408
position actuelle de la fenêtre x = 226 y = 30
position actuelle de la fenêtre x = 481 y = 80
Certaines des sous-classes héritées de wx.Event sont répertoriées dans le tableau suivant -
SN | Événements et description |
---|---|
1 | wxKeyEvent Se produit lorsqu'une touche est enfoncée ou relâchée |
2 | wxPaintEvent Est généré chaque fois que le contenu de la fenêtre doit être redessiné |
3 | wxMouseEvent Contient des données sur tout événement dû à l'activité de la souris, comme le bouton de la souris enfoncé ou glissé |
4 | wxScrollEvent Associé à des contrôles déroulants tels que wxScrollbar et wxSlider |
5 | wxCommandEvent Contient des données d'événement provenant de nombreux widgets tels que des boutons, des boîtes de dialogue, le presse-papiers, etc. |
6 | wxMenuEvent Différents événements liés au menu, à l'exclusion du clic sur le bouton de commande de menu |
sept | wxColourPickerEvent Événements générés par wxColourPickerCtrl |
8 | wxDirFilePickerEvent Événements générés par FileDialog et DirDialog |
Les événements dans wxPython sont de deux types. Événements de base et événements de commande. Un événement de base reste local dans la fenêtre dont il provient. La plupart des wxWidgets génèrent des événements de commande. UNEcommand event peut être propagé à la fenêtre ou aux fenêtres, qui sont au-dessus de la fenêtre source dans la hiérarchie des classes.
Exemple
Voici un exemple simple de propagation d'événements. Le code complet est -
import wx
class MyPanel(wx.Panel):
def __init__(self, parent):
super(MyPanel, self).__init__(parent)
b = wx.Button(self, label = 'Btn', pos = (100,100))
b.Bind(wx.EVT_BUTTON, self.btnclk)
self.Bind(wx.EVT_BUTTON, self.OnButtonClicked)
def OnButtonClicked(self, e):
print 'Panel received click event. propagated to Frame class'
e.Skip()
def btnclk(self,e):
print "Button received click event. propagated to Panel class"
e.Skip()
class Example(wx.Frame):
def __init__(self,parent):
super(Example, self).__init__(parent)
self.InitUI()
def InitUI(self):
mpnl = MyPanel(self)
self.Bind(wx.EVT_BUTTON, self.OnButtonClicked)
self.SetTitle('Event propagation demo')
self.Centre()
self.Show(True)
def OnButtonClicked(self, e):
print 'click event received by frame class'
e.Skip()
ex = wx.App()
Example(None)
ex.MainLoop()
Dans le code ci-dessus, il existe deux classes. MyPanel, une sous-classe wx.Panel et Exemple, une sous-classe wx.Frame qui est la fenêtre de niveau supérieur du programme. Un bouton est placé dans le panneau.
Cet objet Button est lié à un gestionnaire d'événements btnclk () qui le propage à la classe parente (MyPanel dans ce cas). Un clic sur le bouton génère unCommandEvent qui peut être propagé à son parent par la méthode Skip ().
L'objet de classe MyPanel lie également l'événement reçu à un autre gestionnaire OnButtonClicked (). Cette fonction transmet à son tour à son parent, la classe Example. Le code ci-dessus produit la sortie suivante -
Button received click event. Propagated to Panel class.
Panel received click event. Propagated to Frame class.
Click event received by frame class.
Un widget GUI peut être placé à l'intérieur de la fenêtre du conteneur en spécifiant ses coordonnées absolues mesurées en pixels. Les coordonnées sont relatives aux dimensions de la fenêtre définies par l'argument size de son constructeur. La position du widget à l'intérieur de la fenêtre est définie parpos argument de son constructeur.
import wx
app = wx.App()
window = wx.Frame(None, title = "wxPython Frame", size = (300,200))
panel = wx.Panel(window)
label = wx.StaticText(panel, label = "Hello World", pos = (100,50))
window.Show(True)
app.MainLoop()
Ce Absolute Positioning ne convient cependant pas pour les raisons suivantes -
La position du widget ne change pas même si la fenêtre est redimensionnée.
L'apparence peut ne pas être uniforme sur différents périphériques d'affichage avec des résolutions différentes.
La modification de la mise en page est difficile car elle peut nécessiter une refonte de l'ensemble du formulaire.
L'API wxPython fournit des classes de mise en page pour une gestion plus élégante du positionnement des widgets à l'intérieur du conteneur. Les avantages des gestionnaires de mise en page par rapport au positionnement absolu sont:
- Les widgets à l'intérieur de la fenêtre sont automatiquement redimensionnés.
- Assure une apparence uniforme sur les périphériques d'affichage avec différentes résolutions.
- L'ajout ou la suppression dynamique de widgets est possible sans avoir à repenser.
Le gestionnaire de mise en page s'appelle Sizer dans wxPython. Wx.Sizer est la classe de base pour toutes les sous-classes de dimensionneurs. Laissez-nous discuter de certains des calibreurs importants tels que wx.BoxSizer, wx.StaticBoxSizer, wx.GridSizer, wx.FlexGridSizer et wx.GridBagSizer.
SN | Calibreurs et description |
---|---|
1 | BoxSizer Ce calibreur permet aux commandes d'être disposées en ligne ou en colonne. La disposition de BoxSizer est déterminée par son argument d'orientation (wxVERTICAL ou wxHORIZONTAL). |
2 | GridSizer Comme son nom l'indique, un objet GridSizer présente une grille à deux dimensions. Les contrôles sont ajoutés dans la fente de la grille dans l'ordre de gauche à droite et de haut en bas. |
3 | FlexiGridSizer Ce calibreur a également une grille bidimensionnelle. Cependant, il offre un peu plus de flexibilité dans la disposition des commandes dans les cellules. |
4 | GridBagSizer GridBagSizer est un calibreur polyvalent. Il offre plus d'améliorations que FlexiGridSizer. Le widget enfant peut être ajouté à une cellule spécifique de la grille. |
5 | StaticBoxSizer Un StaticBoxSizer place un calibreur de boîte dans une boîte statique. Il fournit une bordure autour de la boîte avec une étiquette en haut. |
Le widget bouton est le plus largement utilisé dans toute interface graphique. Il capture l'événement de clic généré par l'utilisateur. Son utilisation la plus évidente est de déclencher une fonction de gestionnaire qui lui est liée.
La bibliothèque de classes wxPython fournit différents types de boutons. Il y a un bouton simple et traditionnel,wx.Buttonobjet de classe, qui contient du texte comme légende. Un bouton à deux états est également disponible, nommé commewx.ToggleButton. Son état enfoncé ou enfoncé peut être identifié par la fonction de gestionnaire d'événements.
Un autre type de bouton, wx.BitmapButton affiche un bitmap (image) sous forme d'icône sur son visage.
Le constructeur de la classe wx.Button et de la classe wx.ToggleButton prend les arguments suivants -
Wx.Button(parent, id, label, pos, size, style)
Voici quelques méthodes importantes de la classe wx.Button -
SN | Méthodes et description |
---|---|
1 | SetLabel() Définit la légende du bouton par programmation |
2 | GetLabel() Renvoie la légende du bouton |
3 | SetDefault() Le bouton est défini par défaut pour la fenêtre de niveau supérieur. Émule l'événement de clic en appuyant sur la touche Entrée |
Deux méthodes importantes de la classe wx.ToggleButton sont -
SN | Méthodes et description |
---|---|
1 | GetValue() Renvoie l'état du bouton bascule (marche / arrêt) |
2 | SetValue() Définit l'état du bouton par programmation |
Pour créer un bouton bitmap, tout d'abord, un objet bitmap doit être construit à partir d'un fichier image.
La variante suivante du constructeur de classe wx.Bitmap est la plus couramment utilisée -
Wx.Bitmap(fiiename, wx.BITMAP_TYPE)
Certaines des constantes de type bitmap prédéfinies sont -
wx.BITMAP_TYPE_BMP |
wx.BITMAP_TYPE_ICO |
wx.BITMAP_TYPE_CUR |
wx.BITMAP_TYPE_TIFF |
wx.BITMAP_TYPE_TIF |
wx.BITMAP_TYPE_GIF |
wx.BITMAP_TYPE_PNG |
wx.BITMAP_TYPE_JPEG |
wx.BITMAP_TYPE_PCX |
wx.BITMAP_TYPE_ICON |
wx.BITMAP_TYPE_ANY |
Cet objet bitmap est utilisé comme l'un des paramètres du constructeur de classe wx.BitmapButton.
Wx.BitmapButton(parent, id, bitmap, pos, size, style)
Sur certaines plates-formes OS, le bouton bitmap peut afficher à la fois le bitmap et l'étiquette. Les méthodes SetLabel () affectent la légende. Sur d'autres plateformes, il sert de label interne.
Le bouton normal ainsi que le bouton bitmap émettent un wx.CommandEvent. Le classeur EVT_BUTTON lui associe une fonction de gestionnaire.
Le bouton bascule, en revanche, utilise le classeur wx.TOGGLEBUTTON pour la gestion des événements.
Dans l'exemple suivant, les boutons des trois types sont placés dans un gabarit vertical d'un panneau.
L'objet bouton simple est créé à l'aide de l'instruction -
self.btn = wx.Button(panel, -1, "click Me")
Le bouton bascule est construit par l'instruction suivante -
self.tbtn = wx.ToggleButton(panel , -1, "click to on")
Ces boutons sont ajoutés au calibreur vertical en utilisant les instructions suivantes -
vbox.Add(self.btn,0,wx.ALIGN_CENTER)
vbox.Add(self.tbtn,0,wx.EXPAND|wx.ALIGN_CENTER)
Note - En raison de l'indicateur wx.EXPAND, le bouton bascule occupe toute la largeur du cadre.
En utilisant les classeurs EVT_BUTTON et EVT_TOGGLEBUTTON, ils sont associés aux gestionnaires respectifs.
self.btn.Bind(wx.EVT_BUTTON,self.OnClicked)
self.tbtn.Bind(wx.EVT_TOGGLEBUTTON,self.OnToggle)
Trois boutons bitmap sont ajoutés dans un gabarit horizontal. Ces boutons affichent une image sous forme d'icône en guise de légende.
bmp = wx.Bitmap("NEW.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
bmp1 = wx.Bitmap("OPEN.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn1 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp1,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
bmp2 = wx.Bitmap("SAVE.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn2 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp2,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
L'événement Click de ces trois boutons est dirigé vers la méthode OnClicked ().
self.bmpbtn.Bind(wx.EVT_BUTTON, self.OnClicked)
self.bmpbtn1.Bind(wx.EVT_BUTTON, self.OnClicked)
self.bmpbtn2.Bind(wx.EVT_BUTTON, self.OnClicked)
Les étiquettes internes de ces boutons sont respectivement réglées sur NEW, OPEN et SAVE.
La fonction de gestionnaire d'événements OnClicked () récupère le libellé du bouton source, qui a provoqué l'événement de clic. Cette étiquette est imprimée sur la console.
def OnClicked(self, event):
btn = event.GetEventObject().GetLabel()
print "Label of pressed button = ",btn
Le gestionnaire d'événement OnToggle () est déclenché lorsque le bouton bascule est cliqué. Son état est lu par la méthode GetValue () et en conséquence, la légende du bouton est définie.
def OnToggle(self,event):
state = event.GetEventObject().GetValue()
if state == True:
print "off"
event.GetEventObject().SetLabel("click to off")
else:
print "on"
event.GetEventObject().SetLabel("click to on")
La liste complète des codes est la suivante -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (200,150))
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
self.btn = wx.Button(panel,-1,"click Me")
vbox.Add(self.btn,0,wx.ALIGN_CENTER)
self.btn.Bind(wx.EVT_BUTTON,self.OnClicked)
self.tbtn = wx.ToggleButton(panel , -1, "click to on")
vbox.Add(self.tbtn,0,wx.EXPAND|wx.ALIGN_CENTER)
self.tbtn.Bind(wx.EVT_TOGGLEBUTTON,self.OnToggle)
hbox = wx.BoxSizer(wx.HORIZONTAL)
bmp = wx.Bitmap("NEW.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
hbox.Add(self.bmpbtn,0,wx.ALIGN_CENTER)
self.bmpbtn.Bind(wx.EVT_BUTTON,self.OnClicked)
self.bmpbtn.SetLabel("NEW")
bmp1 = wx.Bitmap("OPEN.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn1 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp1,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
hbox.Add(self.bmpbtn1,0,wx.ALIGN_CENTER)
self.bmpbtn1.Bind(wx.EVT_BUTTON,self.OnClicked)
self.bmpbtn1.SetLabel("OPEN")
bmp2 = wx.Bitmap("SAVE.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn2 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp2,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))
hbox.Add(self.bmpbtn2,0,wx.ALIGN_CENTER)
self.bmpbtn2.Bind(wx.EVT_BUTTON,self.OnClicked)
self.bmpbtn2.SetLabel("SAVE")
vbox.Add(hbox,1,wx.ALIGN_CENTER)
panel.SetSizer(vbox)
self.Centre()
self.Show()
self.Fit()
def OnClicked(self, event):
btn = event.GetEventObject().GetLabel()
print "Label of pressed button = ",btn
def OnToggle(self,event):
state = event.GetEventObject().GetValue()
if state == True:
print "Toggle button state off"
event.GetEventObject().SetLabel("click to off")
else:
print " Toggle button state on"
event.GetEventObject().SetLabel("click to on")
app = wx.App()
Mywin(None, 'Button demo')
app.MainLoop()
Le code ci-dessus produit la sortie suivante -
Libellé du bouton enfoncé = cliquez sur Moi
Désactiver l'état du bouton
Activer l'état du bouton
Libellé du bouton enfoncé = NOUVEAU
Libellé du bouton enfoncé = OPEN
Libellé du bouton enfoncé = SAVE
wxAuiest une bibliothèque d'interface utilisateur avancée intégrée à l'API wxWidgets. Wx.aui.AuiManager la classe centrale du framework AUI.
AuiManagergère les volets associés à un cadre particulier en utilisant les informations de chaque volet dans l'objet wx.aui.AuiPanelInfo. Découvrons les différentes propriétés de l'ancrage des contrôles d'objets PanelInfo et du comportement flottant.
L'installation de fenêtres ancrables dans le cadre de niveau supérieur implique les étapes suivantes:
Tout d'abord, créez un objet AuiManager.
self.mgr = wx.aui.AuiManager(self)
Ensuite, un panneau avec les commandes requises est conçu.
pnl = wx.Panel(self)
pbox = wx.BoxSizer(wx.HORIZONTAL)
text1 = wx.TextCtrl(pnl, -1, "Dockable", style = wx.NO_BORDER | wx.TE_MULTILINE)
pbox.Add(text1, 1, flag = wx.EXPAND)
pnl.SetSizer(pbox)
Les paramètres suivants d'AuiPanelInfo sont définis.
Direction - Haut, bas, gauche, droite ou centre
Position- Plusieurs volets peuvent être placés dans une zone ancrable. Chacun reçoit un numéro de position.
Row- Plus d'un volet apparaît sur une ligne. Tout comme plus d'une barre d'outils apparaissant dans la même ligne.
Layer - Les volets peuvent être placés en couches.
À l'aide de ce PanelInfo, le panneau conçu est ajouté à l'objet gestionnaire.
info1 = wx.aui.AuiPaneInfo().Bottom()
self.mgr.AddPane(pnl,info1)
Le reste de la fenêtre de niveau supérieur peut avoir d'autres contrôles comme d'habitude.
Le code complet est le suivant -
import wx
import wx.aui
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title, size = (300,300))
self.mgr = wx.aui.AuiManager(self)
pnl = wx.Panel(self)
pbox = wx.BoxSizer(wx.HORIZONTAL)
text1 = wx.TextCtrl(pnl, -1, "Dockable", style = wx.NO_BORDER | wx.TE_MULTILINE)
pbox.Add(text1, 1, flag = wx.EXPAND)
pnl.SetSizer(pbox)
info1 = wx.aui.AuiPaneInfo().Bottom()
self.mgr.AddPane(pnl, info1)
panel = wx.Panel(self)
text2 = wx.TextCtrl(panel, size = (300,200), style = wx.NO_BORDER | wx.TE_MULTILINE)
box = wx.BoxSizer(wx.HORIZONTAL)
box.Add(text2, 1, flag = wx.EXPAND)
panel.SetSizerAndFit(box)
self.mgr.Update()
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.Centre()
self.Show(True)
def OnClose(self, event):
self.mgr.UnInit()
self.Destroy()
app = wx.App()
Mywin(None,"Dock Demo")
app.MainLoop()
Le code ci-dessus produit la sortie suivante -
Une application GUI typique peut avoir plusieurs fenêtres. Les widgets à onglets et empilés permettent d'activer une de ces fenêtres à la fois. Cependant, cette approche peut souvent ne pas être utile car la vue des autres fenêtres est masquée.
Une façon d'afficher plusieurs fenêtres simultanément consiste à les créer en tant que fenêtres indépendantes. C'est ce qu'on appelle SDI (Single Document Interface). Cela nécessite plus de ressources mémoire car chaque fenêtre peut avoir son propre système de menus, sa propre barre d'outils, etc.
Le framework MDI dans wxPython fournit une classe wx.MDIParentFrame. Son objet agit comme un conteneur pour plusieurs fenêtres enfants, chacune étant un objet de la classe wx.MDIChildFrame.
Les fenêtres enfants résident dans la zone MDIClientWindow du cadre parent. Dès qu'un cadre enfant est ajouté, la barre de menus du cadre parent affiche un menu Fenêtre contenant des boutons pour organiser les enfants en cascade ou en mosaïque.
Exemple
L'exemple suivant illustre les utilisations de MDIParentFrame comme fenêtre de niveau supérieur. Un bouton Menu appelé NewWindow ajoute une fenêtre enfant dans la zone client. Plusieurs fenêtres peuvent être ajoutées, puis organisées dans un ordre en cascade ou en mosaïque.
Le code complet est le suivant -
import wx
class MDIFrame(wx.MDIParentFrame):
def __init__(self):
wx.MDIParentFrame.__init__(self, None, -1, "MDI Parent", size = (600,400))
menu = wx.Menu()
menu.Append(5000, "&New Window")
menu.Append(5001, "&Exit")
menubar = wx.MenuBar()
menubar.Append(menu, "&File")
self.SetMenuBar(menubar)
self.Bind(wx.EVT_MENU, self.OnNewWindow, id = 5000)
self.Bind(wx.EVT_MENU, self.OnExit, id = 5001)
def OnExit(self, evt):
self.Close(True)
def OnNewWindow(self, evt):
win = wx.MDIChildFrame(self, -1, "Child Window")
win.Show(True)
app = wx.App()
frame = MDIFrame()
frame.Show()
app.MainLoop()
Le code ci-dessus produit la sortie suivante -
GDI+ (Interface de dessin graphique), CoreGraphics et Cairo librariesforment le cadre de l'API de dessin dans wxPython. wx.GraphicsContext est l'objet dessinable principal, à l'aide duquel divers objets de contexte de périphérique sont créés.
wx.DC est une classe abstraite. Ses classes dérivées sont utilisées pour rendre des graphiques et du texte sur différents appareils. Les classes de contexte de périphérique sont -
wx.ScreenDC - Utilisez-le pour peindre sur l'écran, par opposition à une fenêtre individuelle.
wx.ClientDC - Utilisez ceci pour peindre sur la zone cliente de la fenêtre (la partie sans bordures et autres décorations), mais ne l'utilisez pas depuis un wxPaintEvent.
wx.PaintDC- Utilisez ceci pour peindre sur la zone cliente de la fenêtre, mais uniquement à partir d'un wxPaintEvent.
wx.WindowDC- Utilisez-le pour peindre sur toute la surface de la fenêtre, y compris les décorations. Cela peut ne pas être disponible sur les plates-formes non Windows.
L'API de dessin de wxPython offre différentes fonctions pour dessiner la forme, le texte et l'image. Les objets nécessaires à des fins de dessin, comme la couleur, le stylo, le pinceau et la police, peuvent également être construits à l'aide de classes GDI.
Classe de couleur wx.
L'objet couleur représente une combinaison de valeurs d'intensité RVB (ROUGE, Vert et Bleu), chacune sur une échelle de 0 à 255. Il existe quelques objets de couleur prédéfinis comme -
- wxBLACK
- wxBLUE
- wxCYAN
- wxGREEN
- wxYELLOW
- wxLIGHT_GREY
- wxRED
- wxWHITE
La couleur avec une combinaison personnalisée de valeurs RVB est formée comme wx.Colour object.
wx.Colour(r,g,b)
Classe wx.Pen
L'objet Pen détermine la couleur, la largeur et le style de la forme des graphiques tels que la ligne, le rectangle, le cercle, etc.
Predefined Pen objects sont -
wxBLACK_DASHED_PEN |
wxBLACK_PEN |
wxBLUE_PEN |
wxCYAN_PEN |
wxGREEN_PEN |
wxYELLOW_PEN |
wxGREY_PEN |
wxLIGHT_GREY_PEN |
wxMEDIUM_GREY_PEN |
wxRED_PEN |
wxTRANSPARENT_PEN |
wxWHITE_PEN |
Predefined Pen styles sont -
wx.SOLID |
wx.DOT |
wx.LONG_DASH |
wx.SHORT_DASH |
wx.DOT_DASH |
wx.TRANSPARENT |
Classe wx.Brush
Le pinceau est un autre objet graphique élémentaire nécessaire pour remplir les arrière-plans de formes telles que rectangle, ellipse, cercle, etc.
Un objet Brush personnalisé nécessite les paramètres de style wx.Colour et Brush. Voici une liste de styles de pinceaux prédéfinis -
wx.SOLID |
wx.STIPPLE |
wx.BDIAGONAL_HATCH |
wx.CROSSDIAG_HATCH |
wx.FDIAGONAL_HATCH |
wx.CROSS_HATCH |
wx.HORIZONTAL_HATCH |
wx.VERTICAL_HATCH |
wx.TRANSPARENT |
wxPython a un certain nombre de fonctions qui facilitent le dessin de différentes formes, textes et images.
SN | Fonctions et description |
---|---|
1 | DrawRectangle() Dessine un rectangle de dimensions données |
2 | DrawCircle() Dessine un cercle au point donné comme centre et rayon |
3 | DrawEllipse() Dessine une ellipse avec les rayons x et y donnés |
4 | DrawLine() Trace une ligne entre deux objets wx.Point |
5 | DrawBitmap() Dessine une image à la position donnée |
6 | DrawText() Affiche le texte donné à la position spécifiée |
Exemple
Les fonctions ci-dessus sont implémentées dans l'exemple suivant, en utilisant les objets Pen, Brush, Color et Font.
Le code complet est le suivant -
import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (500,300))
self.InitUI()
def InitUI(self):
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Centre()
self.Show(True)
def OnPaint(self, e):
dc = wx.PaintDC(self)
brush = wx.Brush("white")
dc.SetBackground(brush)
dc.Clear()
dc.DrawBitmap(wx.Bitmap("python.jpg"),10,10,True)
color = wx.Colour(255,0,0)
b = wx.Brush(color)
dc.SetBrush(b)
dc.DrawCircle(300,125,50)
dc.SetBrush(wx.Brush(wx.Colour(255,255,255)))
dc.DrawCircle(300,125,30)
font = wx.Font(18, wx.ROMAN, wx.ITALIC, wx.NORMAL)
dc.SetFont(font)
dc.DrawText("Hello wxPython",200,10)
pen = wx.Pen(wx.Colour(0,0,255))
dc.SetPen(pen)
dc.DrawLine(200,50,350,50)
dc.SetBrush(wx.Brush(wx.Colour(0,255,0), wx.CROSS_HATCH))
dc.DrawRectangle(380, 15, 90, 60)
ex = wx.App()
Mywin(None,'Drawing demo')
ex.MainLoop()
Le code ci-dessus produit la sortie suivante -
Provision de drag and dropest très intuitif pour l'utilisateur. Il se trouve dans de nombreuses applications de bureau où l'utilisateur peut copier ou déplacer des objets d'une fenêtre à une autre simplement en les faisant glisser avec la souris et en les déposant sur une autre fenêtre.
L'opération glisser-déposer implique les étapes suivantes -
- Déclarer une cible de dépôt
- Créer un objet de données
- Créer wx.DropSource
- Exécuter l'opération de glissement
- Annuler ou accepter le dépôt
Dans wxPython, il existe deux cibles de dépôt prédéfinies -
- wx.TextDropTarget
- wx.FileDropTarget
De nombreux widgets wxPython prennent en charge l'activité glisser-déposer. Le contrôle source doit avoir le glissement activé, tandis que le contrôle cible doit être en mesure d'accepter (ou de rejeter) le glissement.
Les données source que l'utilisateur fait glisser sont placées sur l'objet cible. OnDropText () de l'objet cible consomme les données. Si vous le souhaitez, les données de l'objet source peuvent être supprimées.
Exemple
Dans l'exemple suivant, deux objets ListCrl sont placés horizontalement dans un Box Sizer. La liste sur la gauche est remplie avec des données de langues []. Il est désigné comme la source de la traînée. L'un sur la droite est la cible.
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript', 'PHP', 'VB.NET','C#']
self.lst1 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
self.lst2 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
for lang in languages:
self.lst1.InsertStringItem(0,lang)
Le deuxième contrôle de liste est vide et est un argument pour l'objet de la classe TextDropTarget.
class MyTextDropTarget(wx.TextDropTarget):
def __init__(self, object):
wx.TextDropTarget.__init__(self)
self.object = object
def OnDropText(self, x, y, data):
self.object.InsertStringItem(0, data)
La méthode OnDropText () ajoute des données source dans le contrôle de liste cible.
L'opération de glissement est initialisée par le classeur d'événements.
wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
La fonction OnDragInit () place les données de glissement sur la cible et les supprime de la source.
def OnDragInit(self, event):
text = self.lst1.GetItemText(event.GetIndex())
tobj = wx.PyTextDataObject(text)
src = wx.DropSource(self.lst1)
src.SetData(tobj)
src.DoDragDrop(True)
self.lst1.DeleteItem(event.GetIndex())
Le code complet est le suivant -
import wx
class MyTarget(wx.TextDropTarget):
def __init__(self, object):
wx.TextDropTarget.__init__(self)
self.object = object
def OnDropText(self, x, y, data):
self.object.InsertStringItem(0, data)
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (-1,300))
panel = wx.Panel(self)
box = wx.BoxSizer(wx.HORIZONTAL)
languages = ['C', 'C++', 'Java', 'Python', 'Perl', 'JavaScript',
'PHP', 'VB.NET','C#']
self.lst1 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
self.lst2 = wx.ListCtrl(panel, -1, style = wx.LC_LIST)
for lang in languages:
self.lst1.InsertStringItem(0,lang)
dt = MyTarget(self.lst2)
self.lst2.SetDropTarget(dt)
wx.EVT_LIST_BEGIN_DRAG(self, self.lst1.GetId(), self.OnDragInit)
box.Add(self.lst1,0,wx.EXPAND)
box.Add(self.lst2, 1, wx.EXPAND)
panel.SetSizer(box)
panel.Fit()
self.Centre()
self.Show(True)
def OnDragInit(self, event):
text = self.lst1.GetItemText(event.GetIndex())
tobj = wx.PyTextDataObject(text)
src = wx.DropSource(self.lst1)
src.SetData(tobj)
src.DoDragDrop(True)
self.lst1.DeleteItem(event.GetIndex())
ex = wx.App()
Mywin(None,'Drag&Drop Demo')
ex.MainLoop()
Le code ci-dessus produit la sortie suivante -