[PageD'Accueil] [IndexDesTitres] [IndexDesTermes

Utilisation de la bibliothèque WxPython (wxWindows)

La bibliothèque wxPython http://www.wxpython.org fournit des compostants évolués (tables, tree...) compatibles Linux (gtk), Windows et MacOSX. Vous trouverez un howto pour installer wxPython sur MacOsX sur cette page.

Visualisation d'images

wxPython

Boa Constructor

wxMozilla Ce module permet d'integrer Mozilla a vos apllications WxPython

Exemples

Affichage d'une frame calée en bas de l'écran

La méthode n'existe pas en natif dans wx (ceci n'engage que moi, je ne connais pas les 450 classes à fond...). Par contre, avec un minimum de calcul, elle est facile à remplacer.

   1 # -*- coding: iso-8859-1 -*-
   2 import wx
   3 class MyApp(wx.App):
   4     def OnInit(self):
   5         #--création fenêtre avec tout par défaut sauf le titre
   6         frame = wx.Frame(None, -1, "Bonjour!")
   7         #--centrage sur l'écran
   8         frame.CenterOnParent(wx.BOTH)
   9         #--récup zone d'affichage bureau (la hauteur est le 4ème élément)
  10         zAffBur= wx.GetClientDisplayRect()
  11         #--extrapole la ligne d'affichage d'après la hauteur de frame
  12         y= zAffBur[3] - frame.GetSizeTuple()[1]
  13         #--la colonne ne change pas dans cet exemple
  14         x= frame.GetPositionTuple()[0]
  15         #--et voilà !
  16         frame.MoveXY(x,y)
  17         #--
  18         frame.Show(1)
  19         return True
  20 app = MyApp(0)
  21 app.MainLoop() 

Affichage et conversion d'une image en noir et blanc

   1 # -*- coding: iso-8859-1 -*-
   2 import wx
   3 #----------------------------------------------------------------------
   4 # nb: le fichier jpeg doit être présent
   5 class mainWindow(wx.Frame):
   6     def __init__(self):
   7         wx.Frame.__init__(self,None,wx.ID_ANY,'Affichage images')
   8         #--le sizer va servir à positionner les images et dimensionner la fenêtre
   9         sizerH= wx.BoxSizer(wx.HORIZONTAL)
  10         #--l'image est d'abord affichée telle que...
  11         img= wx.Image('amélie.jpg',wx.BITMAP_TYPE_JPEG)
  12         bmp= wx.BitmapFromImage(img)
  13         staticBmp= wx.StaticBitmap(self,wx.ID_ANY,bmp)
  14         sizerH.Add(staticBmp)
  15         #--...puis modifiée pour ne conserver que du blanc et du noir
  16         data1= img.GetData()
  17         blanc= chr(255)*3
  18         noir= chr(0)*3
  19         choice= (blanc, noir)
  20         seuil= chr(128) # changer la valeur pour un résultat différent (un seuil élevé pour une image pâle)
  21         data2= ''.join([choice[pix < seuil] for pix in data1[::3]])
  22         img.SetData(data2)
  23         bmp= wx.BitmapFromImage(img)
  24         staticBmp= wx.StaticBitmap(self,wx.ID_ANY,bmp)
  25         sizerH.Add(staticBmp)
  26         #--régler la taille de la fenêtre
  27         self.SetSizer(sizerH)
  28         self.SetAutoLayout(1)
  29         sizerH.Fit(self)
  30         #--
  31         self.Show(True)
  32 #----------------------------------------------------------------------
  33 app = wx.PySimpleApp()
  34 frame=mainWindow()
  35 app.MainLoop()
  36 del app
  37 #----------------------------------------------------------------------

Utilisation de l'objet wxListCtrl

   1 #D'apres un exemple de Mark Hammond
   2 #publié dans son ouvrage Progammation Win32 chez O'Reilly
   3 #Ce programme est loin d'être terminé, n'hésitez pas à vous l'approprier
   4 #et à le modifier selon votre convenance ;-)
   5 #Auteur : Salvatore
   6 
   7 from wxPython.wx import *
   8 import time
   9 import types
  10 
  11 donnees = {0 : {"nom" : "Tom","prenom":"Edjjery","email":"tom.edjjery@lands.com"},\
  12            1 : {"nom" : "Annie","prenom":"Balle","email":"annie.balle@karpate.org"},\
  13            2 : {"nom" : "Judas","prenom":"Bricaut","email":"judas.bricaut@orange.net"},\
  14            }
  15 
  16 #Constantes menu Fichier
  17 ID_NOUVEAU      = wxNewId()
  18 ID_OUVRIR       = wxNewId()
  19 ID_SAUVER       = wxNewId()
  20 ID_SAUVERSOUS   = wxNewId()
  21 ID_QUITTER      = wxNewId()
  22 
  23 #Constante menu Aide
  24 ID_EDITION      = wxNewId()
  25 
  26 #Identificateur de l'objet Liste
  27 ID_LIST         = wxNewId()
  28 
  29 
  30 class Fenetre(wxMDIParentFrame):
  31 #Dans une application SDI on peut utiliser la classe de base 'wxFrame'
  32     def __init__(self,parent,ID,titre,taille,position):
  33         wxMDIParentFrame.__init__(self,parent,ID,titre,taille,position,\
  34             style=wxFRAME_NO_WINDOW_MENU|wxDEFAULT_FRAME_STYLE|wxMAXIMIZE)
  35         self.Show(true)
  36         self.Center()
  37         self.CreerMenu()
  38         self.CreerBarreEtat()
  39 
  40     def CreerMenu(self):
  41         #Definition de menu fichier
  42         self.menufichier = wxMenu()
  43         self.menufichier.Append(ID_NOUVEAU,"Nouveau","Creer un fichier")
  44         self.menufichier.Append(ID_OUVRIR,"Ouvrir","Ouvrir un fichier existant")
  45         self.menufichier.Append(ID_SAUVER,"Sauver","Enregistrer le fichier")
  46         self.menufichier.Append(ID_SAUVERSOUS,"Sauver sous","Enregistrer sous un autre nom")
  47         self.menufichier.Append(ID_QUITTER,"Quitter","Quitter le programme")
  48 
  49         #Definition du menu aide
  50         self.menuedition = wxMenu()
  51         self.menuedition.Append(ID_EDITION,"Liste","Listage des informations")
  52 
  53         #Definition des gestionnaires d'evenements lies au menu
  54         EVT_MENU(self,ID_NOUVEAU,self.Creation)
  55         EVT_MENU(self,ID_OUVRIR,self.Ouverture)
  56         EVT_MENU(self,ID_SAUVER,self.Sauvegarde)
  57         EVT_MENU(self,ID_SAUVERSOUS,self.SauvegardeSous)
  58         EVT_MENU(self,ID_QUITTER,self.Termine)
  59         EVT_MENU(self,ID_EDITION,self.Liste)
  60 
  61         #Definition de la barre de menu et insertion des menus
  62         self.menubar = wxMenuBar()
  63         self.menubar.Show(true)
  64         self.menubar.Append(self.menufichier,"&Fichier")
  65         self.menubar.Append(self.menuedition,"&Edition")
  66         self.SetMenuBar(self.menubar)
  67 
  68     def Creation(self, event):
  69         dlg = wxFileDialog(self,"Nom du fichier","","","*.py;*.pyw",wxOPEN)
  70         retour = dlg.ShowModal()
  71         if retour == wxID_OK :
  72             chemin = dlg.GetPath()
  73             self.SetTitle(chemin)
  74             message = wxMessageDialog(self, "Vous etes en phase de creation","Information",\
  75             style=wxICON_INFORMATION|wxCENTRE,pos=wxDefaultPosition)
  76             message.ShowModal()
  77             #Routine de creation
  78 
  79     def Ouverture(self, event):
  80         dlg = wxFileDialog(self,"Nom du fichier","","","*.py;*.pyw",wxOPEN)
  81         retour = dlg.ShowModal()
  82         if retour == wxID_OK :
  83             chemin = dlg.GetPath()
  84             self.SetTitle(chemin)
  85             message = wxMessageDialog(self, "Vous etes en phase de creation","Titre de fenêtre",\
  86             style=wxICON_INFORMATION|wxCENTRE,pos=wxDefaultPosition)
  87             message.ShowModal()
  88             #Routine à l'ouverture d'unfichier existant
  89 
  90     def Sauvegarde(self, event):
  91         messa = Message(self,"Attention")
  92 
  93     def SauvegardeSous(self, event):
  94         pass
  95 
  96     def Termine(self, event):
  97         pass
  98 
  99     def Liste(self, event):
 100         self.menuedition.Enable(ID_EDITION,FALSE)
 101         self.liste = Liste(self,-1,"",(0,0))
 102         self.liste.Center()
 103         self.SetStatusText("Listage des donnees",0)
 104         print self.GetClientSize()
 105 
 106     def Notify(self):
 107         temps   = time.localtime(time.time())
 108         stemps = time.strftime("%d-%b-%Y %I:%M:%S",temps)
 109         self.SetStatusText(stemps,1)
 110 
 111     def CreerBarreEtat(self):
 112         self.CreateStatusBar(2)
 113         self.SetStatusWidths([-1,150])
 114         #self.timer = wxPyTimer(self.Notify)
 115         #self.timer.Start(10)
 116         #self.Notify()
 117 
 118 
 119 class Liste(wxMDIChildFrame):
 120     def __init__(self,parent,ID,title,position=(0,0)):
 121         wxMDIChildFrame.__init__(self,parent,ID,"Liste",(0,0),size=(500,400),\
 122                                  style = wxDEFAULT_FRAME_STYLE)
 123         #permet de recuperer la fenetre principale
 124         self.fenetre_parente = parent
 125         self.lc = wxListCtrl(self,ID_LIST,style=wxLC_REPORT|wxSUNKEN_BORDER)
 126         self.lc.InsertColumn(0, "Nom")
 127         self.lc.InsertColumn(1, "Prenom")
 128         self.lc.InsertColumn(2, "Email")
 129 
 130         self.item_courant = 0
 131         self.lig_donnees = ()
 132 
 133         #Fixe la largeur des colonnes 1 et 2 en vue de d'en déduire la largeur de la derniere
 134         self.lc.SetColumnWidth(0,100)
 135         self.lc.SetColumnWidth(1,100)
 136 
 137         #On remplit la liste
 138         items = donnees.items()
 139         index = 0
 140         for index in range(len(donnees.items())):
 141             self.lc.InsertStringItem(index,donnees[index]["nom"])
 142             self.lc.SetStringItem(index,1,donnees[index]["prenom"])
 143             self.lc.SetStringItem(index,2,donnees[index]["email"])
 144 
 145         EVT_LIST_ITEM_SELECTED(self,ID_LIST,self.OnSelection)
 146         EVT_LEFT_DCLICK(self.lc,self.OnDoubleClick)
 147         EVT_CLOSE(self,self.OnClose)
 148 
 149     def OnSelection(self, event):
 150         self.item_courant = event.m_itemIndex
 151         self.lig_donnees = donnees[self.item_courant]['nom'],\
 152                            donnees[self.item_courant]['prenom'],\
 153                            donnees[self.item_courant]['email']
 154 
 155 
 156     def OnDoubleClick(self, event):
 157         self.ActiveFiche()
 158 
 159     def ActiveFiche(self):
 160         fiche = Fiche(self,"Fiche de dialogue",self.lig_donnees)
 161 
 162     def OnClose(self, event):
 163         inf = Info(self.fenetre_parente,titre = "Info sur la liste",message = \
 164                                                   "Voulez-vous fermez cette fenetre ?")
 165         self.fenetre_parente.menuedition.Enable(ID_EDITION,TRUE)
 166         self.Destroy()
 167 
 168 
 169 class Titre_Champ:
 170     def __init__(self,parent,label,valeur,pos_x=0,pos_y=0,largeur=150):
 171         posx = pos_x
 172         posy = pos_y
 173         larg = largeur
 174         wxStaticText(parent,-1,label,(posx,posy),(50,20),style=wxALIGN_RIGHT )
 175         wxTextCtrl(parent,-1,valeur,(posx+55,posy-2),(largeur,20))
 176 
 177 class Fiche(wxDialog):
 178     def __init__(self,parent,titre,donnees):
 179         posx = 30;posy = 40;espacev = 30
 180         wxDialog.__init__(self,parent,-1,titre,pos = wxDefaultPosition,size = (300,200))
 181         tc_nom    = Titre_Champ(self,"Nom :",donnees[0],posx,posy)
 182         tc_prenom = Titre_Champ(self,"Prenom :",donnees[1],posx,posy + espacev)
 183         tc_age    = Titre_Champ(self,"Email :",donnees[2],posx,posy + 2*espacev)
 184         (sx,sy) = self.GetClientSize()
 185         box = wxStaticBox(self,-1,"",(0,0),(sx,sy))
 186         self.ShowModal()
 187 
 188 
 189 class Info(wxMessageDialog):
 190     def __init__(self,parent, message = "Message", titre = "Titre"):
 191         wxMessageDialog.__init__(self,parent, message, titre, wxOK | wxCANCEL)
 192         if self.ShowModal() == wxID_OK:
 193             pass
 194 
 195 class Application(wxApp):
 196     def OnInit(self):
 197         fenprinc = Fenetre(NULL,-1,"Application wxPython",(300,300),(500,500))
 198         self.SetTopWindow(fenprinc)
 199         return true
 200 
 201 def main():
 202     monappli = Application()
 203     monappli.MainLoop()
 204 
 205 if __name__ == '__main__':
 206     main()

Ajout d'une ligne sur un Grid géré avec une Grid table

Bricolé à partir de gridcusttable.py provenant de la démo pywx. Le programme est autonome et fonctionne avec python 2.4 et wx 2.6 sous Windows XP. Les démos donnent des tas d'exemples pour créer et modifier des Grid, mais pas pour ajouter des lignes. Or dans le cas du Grid basé sur une Grid table, les fonctions Appendrows et Insertrows ne fonctionnent pas. Le principe retenu ici est de simplement ajouter une ligne à la table et de détruire puis recréer le Grid. Comme le Refresh() ne fonctionne pas non plus, on contourne en faisant un Getsize() suivi d'un Setsize(). Si vous avez des questions, rendez-vous dans le news python.

   1 #---------------------------------------------------------------------------
   2 from wxPython.wx import *
   3 from wxPython.grid import *
   4 #---------------------------------------------------------------------------
   5 class CustomDataTable(wxPyGridTableBase):
   6     def __init__(self,data):
   7         self.data= data
   8         wxPyGridTableBase.__init__(self)
   9         self.colLabels = ['ID', 'Description', 'Severity', 'Priority', 'Platform',
  10                           'Opened?', 'Fixed?', 'Tested?', 'TestFloat']
  11         self.dataTypes = [wxGRID_VALUE_NUMBER,
  12                           wxGRID_VALUE_STRING,
  13                           wxGRID_VALUE_CHOICE + ':only in a million years!,wish list,minor,normal,major,critical',
  14                           wxGRID_VALUE_NUMBER + ':1,5',
  15                           wxGRID_VALUE_CHOICE + ':all,MSW,GTK,other',
  16                           wxGRID_VALUE_BOOL,
  17                           wxGRID_VALUE_BOOL,
  18                           wxGRID_VALUE_BOOL,
  19                           wxGRID_VALUE_FLOAT + ':6,2',
  20                           ]
  21     def GetNumberRows(self):
  22         return len(self.data) + 1
  23     def GetNumberCols(self):
  24         return len(self.data[0])
  25     def IsEmptyCell(self, row, col):
  26         try:
  27             return not self.data[row][col]
  28         except IndexError:
  29             return true
  30     def GetValue(self, row, col):
  31         try:
  32             return self.data[row][col]
  33         except IndexError:
  34             return ''
  35     def SetValue(self, row, col, value):
  36         try:
  37             self.data[row][col] = value
  38         except IndexError:
  39             self.data.append([''] * self.GetNumberCols())
  40             self.SetValue(row, col, value)
  41             msg = wxGridTableMessage(self,                             # The table
  42                                      wxGRIDTABLE_NOTIFY_ROWS_APPENDED, # what we did to it
  43                                      1)                                # how many
  44             self.GetView().ProcessTableMessage(msg)
  45             self.GetView().MoveCursorDown(false)
  46     def GetColLabelValue(self, col):
  47         return self.colLabels[col]
  48     def GetTypeName(self, row, col):
  49         return self.dataTypes[col]
  50     def CanGetValueAs(self, row, col, typeName):
  51         colType = self.dataTypes[col].split(':')[0]
  52         if typeName == colType:
  53             return true
  54         else:
  55             return False
  56     def CanSetValueAs(self, row, col, typeName):
  57         return self.CanGetValueAs(row, col, typeName)
  58 #---------------------------------------------------------------------------
  59 class CustTableGrid(wxGrid):
  60     def __init__(self, parent, data):
  61         wxGrid.__init__(self, parent, -1)
  62         self.table = CustomDataTable(data)
  63         self.SetTable(self.table, true)
  64         self.SetRowLabelSize(0)
  65         self.SetMargins(0,0)
  66         self.AutoSizeColumns(False)
  67         EVT_GRID_CELL_LEFT_DCLICK(self, self.OnLeftDClick)
  68     def OnLeftDClick(self, evt):
  69         if self.CanEnableCellControl():
  70             self.EnableCellEditControl()
  71 #---------------------------------------------------------------------------
  72 class TestFrame(wxFrame):
  73     def __init__(self, parent):
  74         wxFrame.__init__(self, parent, -1, "Custom Table, data driven Grid  Demo", size=(640,480))
  75         self.data = [
  76             [1010, "The foo doesn't bar", "major", 1, 'MSW', 1, 1, 1, 1.12],
  77             [1011, "I've got a wicket in my wocket", "wish list", 2, 'other', 0, 0, 0, 1.50],
  78             [1012, "Rectangle() returns a triangle", "critical", 5, 'all', 0, 0, 0, 1.56]
  79             ]
  80         self.initwin()
  81     def initwin(self):
  82         self.ref= None
  83         self.p = wxPanel(self, -1, style=0)
  84         b = wxButton(self.p, -1, "Add line...")
  85         b.SetDefault()
  86         EVT_BUTTON(self, b.GetId(), self.OnButton)
  87         self.bs = wxBoxSizer(wxVERTICAL)
  88         self.grid = CustTableGrid(self.p,self.data)
  89         self.bs.Add(self.grid, 1, wxGROW|wxALL, 5)
  90         self.bs.Add(b)
  91         self.p.SetSizer(self.bs)
  92     def OnButton(self, evt):
  93         self.data.append([1010, "Added line", "major", 1, 'MSW', 1, 1, 1, 1.12])
  94         sz= self.p.GetSize()
  95         self.p.Destroy()
  96         self.initwin()
  97         self.p.SetSize(sz)
  98         print "button selected"
  99 #-------------------------------------------------------------------------------
 100 class mApp(wxApp):
 101     def OnInit(self):
 102         frame= TestFrame(None)
 103         frame.Show(true)
 104         return true
 105 #-------------------------------------------------------------------------------
 106 app = mApp(0)
 107 app.MainLoop()
 108 #-------------------------------------------------------------------------------

Exemple de Drag'n'drop acceptant plusieurs formats

La démo donne un exemple de Drag'n'drop, mais qui n'accepte que du texte ou des noms de fichiers, mais pas les deux sur la même fenêtre. L'exemple qui suit accepte à la fois texte et noms de fichiers sur sa fenêtre. Pour tester, lancez le programme et faites glisser des fichiers (depuis l'explorateur) ou des liens (depuis le navigateur) vers la fenêtre du programme. Le résultat s'affiche dans la console. Si vous avez des questions, rendez-vous dans le news python.

   1 # -*- coding: iso-8859-1 -*-
   2 import wx
   3 import wx.lib.scrolledpanel as scroll
   4 #----------------------------------------------------------------------
   5 class MyTextDropTarget(wx.TextDropTarget):
   6     def OnDropText(self, x, y, text):
   7         print 'text:',text
   8 #----------------------------------------------------------------------
   9 class MyFileDropTarget(wx.FileDropTarget):
  10     def OnDropFiles(self, x, y, filenames):
  11         print 'filenames:'
  12         for file in filenames:
  13             print file
  14 #----------------------------------------------------------------------
  15 class OtherDropTarget(wx.PyDropTarget):
  16     def __init__(self):
  17         wx.PyDropTarget.__init__(self)
  18         self.setDo()
  19     def setDo(self):
  20         #--permet plusieurs formats dragndrop...
  21         self.do = wx.DataObjectComposite()
  22         #--...noms de fichiers...
  23         self.fdo= wx.FileDataObject()
  24         self.do.Add(self.fdo)
  25         #--...et texte
  26         self.tdo= wx.TextDataObject()
  27         self.do.Add(self.tdo)
  28         #--
  29         self.SetDataObject(self.do)
  30     def OnData(self,*args):
  31         self.GetData()
  32         print 'filenames:',self.fdo.GetFilenames()
  33         print 'text:',self.tdo.GetText()
  34         self.setDo()
  35 #----------------------------------------------------------------------
  36 class MainWindow(wx.Frame):
  37     def __init__(self,parent,id,title):
  38         wx.Frame.__init__(self,parent,wx.ID_ANY, title, pos=wx.Point(10,10), size=wx.Size(800,500), style=wx.DEFAULT_FRAME_STYLE)
  39         #--choisir une des trois possibilités
  40         #dt= MyFileDropTarget() # fichiers seulement
  41         #dt= MyTextDropTarget() # texte seulement
  42         dt= OtherDropTarget() # fichiers + texte
  43         #--
  44         self.SetDropTarget(dt)
  45         nb= wx.Notebook(self,wx.ID_ANY,style=wx.TAB_TRAVERSAL)
  46         panel= scroll.ScrolledPanel(nb,wx.ID_ANY,style=wx.SUNKEN_BORDER|wx.TAB_TRAVERSAL)
  47         panel.SetupScrolling()
  48         nb.AddPage(panel,'dragndrop panel')
  49         sizer= wx.BoxSizer(wx.VERTICAL)
  50         sizer.Add(wx.StaticText(panel, -1, "Drag some files or text here:"),0, wx.EXPAND|wx.ALL, 2)
  51         panel.SetSizer(sizer)
  52         self.Show(1)
  53 #----------------------------------------------------------------------
  54 app = wx.PySimpleApp()
  55 frame=MainWindow(None,-1,'Drop')
  56 app.MainLoop()
  57 del app
  58 #----------------------------------------------------------------------

Exemple de Wizard

La démo donne un exemple de Wizard, mais qui est un peu compliqué, et ne règle pas le problème des textes anglais sur les boutons.

   1 # -*- coding: iso-8859-1 -*-
   2 import wx
   3 import wx.wizard as wiz
   4 import pywin.debugger, sys, time
   5 #----------------------------------------------------------------------
   6 class wizardText:
   7     def __init__(self, parent):
   8         self.wizard = wiz.Wizard(None, -1, "Wizard simple")
   9         page1 = SkipNextPage(self.wizard, "Page 1", 1)
  10         page1.jump= True
  11         page1.sizer.Add(wx.StaticText(page1, -1, """Votre texte est ici."""))
  12         page2 = SkipNextPage(self.wizard, "Page 2", 2)
  13         page2.sizer.Add(wx.StaticText(page2, -1, """page 2."""))
  14         page3 = SkipNextPage(self.wizard, "Page 3", 3)
  15         page3.sizer.Add(wx.StaticText(page3, -1, """page 3."""))
  16         page4 = SkipNextPage(self.wizard, "Page 4", 4)
  17         page4.sizer.Add(wx.StaticText(page4, -1, "Ceci est la dernière page."))
  18         self.page1 = page1
  19         self.wizard.FitToPage(page1)
  20         # Connects the pages
  21         page1.SetNext(page2)
  22         page2.SetPrev(page1)
  23         page2.SetNext(page3)
  24         page3.SetPrev(page2)
  25         page3.SetNext(page4)
  26         page4.SetPrev(page3)
  27         # Connects the events
  28         self.wizard.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnWizPageChanged)
  29         self.wizard.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnWizPageChanging)
  30         self.wizard.Bind(wiz.EVT_WIZARD_CANCEL, self.OnWizCancel)
  31         self.wizard.Bind(wiz.EVT_WIZARD_FINISHED, self.OnWizFinished)
  32         # Runs
  33         if self.wizard.RunWizard(page1):
  34             wx.MessageBox("Wizard terminé avec succès", "C'est tout les gars !")
  35         else:
  36             wx.MessageBox("Wizard annulé", "C'est tout les gars !")
  37     def OnWizPageChanged(self, evt):
  38         texts= (('&Next >','&Suivant >'),('&Cancel','&Annuler'),('< &Back','< &Retour'),('&Finish','Finir'))
  39         for o in self.wizard.GetChildren():
  40             if 'Button' in str(type(o)):
  41                 for tEng,tFr in texts:
  42                     if o.GetLabel() == tEng:
  43                         o.SetLabel(tFr)
  44         if evt.GetDirection():
  45             dir = "forward"
  46         else:
  47             dir = "backward"
  48     def OnWizPageChanging(self, evt):
  49         if evt.GetDirection():
  50             dir = "forward"
  51         else:
  52             dir = "backward"
  53     def OnWizCancel(self, evt):
  54         page = evt.GetPage()
  55         # Show how to prevent cancelling of the wizard.  The
  56         # other events can be Veto'd too.
  57         if page is self.page1:
  58             wx.MessageBox("Interdit sur cette page.", "Désolé")
  59             evt.Veto()
  60     def OnWizFinished(self, evt):
  61         wx.MessageBox("Fini", "Fini")
  62 #----------------------------------------------------------------------
  63 class SkipNextPage(wiz.PyWizardPage):
  64     def __init__(self, parent, title, id):
  65         wiz.PyWizardPage.__init__(self, parent)
  66         self.id= id
  67         self.next = self.prev = None
  68         self.sizer = wx.BoxSizer(wx.VERTICAL)
  69         self.jump= False
  70     def SetNext(self, next):
  71         self.next = next
  72     def SetPrev(self, prev):
  73         self.prev = prev
  74     def GetNext(self):
  75         next= self.next
  76         if self.jump and next != None:
  77             next= next.GetNext()
  78         return next
  79     def GetPrev(self):
  80         return self.prev
  81 #----------------------------------------------------------------------
  82 app = wx.PySimpleApp()
  83 win = wizardText(None)
  84 #----------------------------------------------------------------------

Exemple d'affichage d'une sinusoïde

   1 # -*- coding: iso-8859-1 -*-
   2 import math,wx  # wx doit être installé, voir www.wxpython.org
   3 #----------------------------------------------------------------------
   4 class DrawPanel(wx.Panel):  # wx.Panel est simplement un conteneur d'objets
   5     # __init__ est le constructeur
   6     def __init__(self, parent):
   7         wx.Panel.__init__(self, parent)  # appel du constructeur de wx.Panel
   8         self.SetBackgroundColour(wx.WHITE)
   9         self.Bind(wx.EVT_PAINT, self.OnPaint)  # gérer évènement wx.EVT_PAINT dans OnPaint
  10         #--construction coordonnées des points de la sinusoïde
  11         self.points = []
  12         x= float(0)  # x est l'abscisse
  13         for n in range(10000):
  14             x+= 0.25
  15             k= float(n)/100
  16             y= (math.sin(k)*100)+100  # y est l'ordonnée
  17             self.points.append((int(x),int(y)))
  18     # OnPaint est appelée à chaque affichage
  19     def OnPaint(self, evt):
  20         dc = wx.PaintDC(self)  # wx.PaintDC est un contexte de dispositif
  21         dc.BeginDrawing()
  22         dc.Clear()  # effacement de la zone d'affichage
  23         dc.SetPen(wx.Pen("BLACK"))  # on dit qu'on va écrire en noir
  24         dc.DrawPointList(self.points)  # on écrit les points dont les coordonnées sont dans self.points
  25         dc.EndDrawing()
  26 #----------------------------------------------------------------------
  27 app= wx.PySimpleApp()  # app va gérer la procédure de fenêtre
  28 frame=wx.Frame(None,wx.ID_ANY,'Test')  # création de la fenêtre de base
  29 panel= DrawPanel(frame)  # création du conteneur d'objets
  30 frame.Show()  # afficher frame
  31 app.MainLoop()  # entrer dans la boucle d'évènements
  32 #----------------------------------------------------------------------

Exemple d'utilisation du composant Splitter

   1 # -*- coding: iso-8859-1 -*-
   2 
   3 # Exemple d'utilsation du composant 'Splitter'
   4 
   5 import os
   6 import wx
   7 
   8 ID_ABOUT = wx.NewId()
   9 ID_OPEN  = wx.NewId()
  10 ID_EXIT  = wx.NewId()
  11    
  12 class MyFrame(wx.Frame):
  13     def __init__(self, parent, id, title):
  14         wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(1024, 800))
  15 
  16         self.initpos = 50
  17 
  18         #Status Bar
  19         self.CreateStatusBar()
  20 
  21         #Menu Fichier
  22         filemenu = wx.Menu()
  23         filemenu.Append(ID_OPEN,'&Ouvrir')
  24         filemenu.Append(ID_EXIT,'&Quitter')
  25         #Menu Aide
  26         aidemenu = wx.Menu()
  27         aidemenu.Append(ID_ABOUT,'&Aide')
  28         #Barre de Menu
  29         menubar = wx.MenuBar()
  30         menubar.Append(filemenu,'&Fichier')
  31         menubar.Append(aidemenu,'&Aide')
  32         self.SetMenuBar(menubar)
  33         #Gestionnaire d'evenement menu
  34         wx.EVT_MENU(self, ID_ABOUT, self.OnAbout)
  35         wx.EVT_MENU(self, ID_EXIT, self.OnExit)
  36         wx.EVT_MENU(self, ID_OPEN, self.OnOpen)        
  37 
  38         #Splitter
  39         splitter1 = wx.SplitterWindow(self, -1, style=wx.SP_3D)
  40         splitter1.SetMinimumPaneSize(100)
  41         splitter1.SetSashPosition(40)
  42         splitter1.UpdateSize()
  43         splitter2 = wx.SplitterWindow(splitter1, -1, style=wx.SP_3D)
  44         splitter2.SetMinimumPaneSize(200)
  45         splitter2.SetSashPosition(40)
  46         
  47         self.sidebar = wx.TreeCtrl(splitter1, id=-1, pos=wx.DefaultPosition,\
  48             size=wx.DefaultSize, style=wx.TR_HAS_BUTTONS,\
  49             validator=wx.DefaultValidator, name="treeCtrl")                        
  50         
  51         self.up =wx.TextCtrl(splitter2, wx.NewId(), "Un texte", size=(100, -1),pos=(80, 50))
  52         self.down = wx.ListCtrl(splitter2, -1, style=wx.LC_LIST)
  53 
  54         splitter1.SplitVertically(self.sidebar, splitter2,200)
  55         splitter2.SplitHorizontally(self.up, self.down,-1)        
  56          
  57         self.Centre()
  58 
  59     def ShowMessage(self,msg):
  60         d = wx.MessageDialog(self, msg, style=wx.OK)
  61         d.ShowModal()
  62         d.Destroy()        
  63 
  64     def OnAbout(self, event):
  65         self.ShowMessage("About")
  66 
  67     def OnExit(self,e):
  68         self.Close(True)
  69 
  70     def OnOpen(self,e):
  71         #Ouverture d'un fichier"
  72         self.dirname = ""
  73         wildcard = "*.py"
  74         dlg = wx.FileDialog(
  75             self, message="Choose a file",
  76             defaultDir=os.getcwd(),            
  77             defaultFile="",
  78             wildcard=wildcard,
  79             style=wx.OPEN | wx.MULTIPLE | wx.CHANGE_DIR
  80             )
  81         if dlg.ShowModal() == wx.ID_OK:
  82             path = dlg.GetPath()
  83             f = open(path)
  84             self.control.SetValue(f.read())
  85         dlg.Destroy()
  86       
  87 class MyApp(wx.App):
  88     def OnInit(self):
  89         frame = MyFrame(None, -1, "dragdrop.py")
  90         frame.Show(True)
  91         self.SetTopWindow(frame)
  92         return True
  93 
  94 app = MyApp(0)
  95 app.MainLoop()

2016-06-05 21:43