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
- Permet de visualiser les images d'un répertoire, de changer de répertoire, d'effectuer quelques manipulations (effacer, retourner).
wxPython
- Wrapper pour la bibliothèque wxWidgets (ex wxWindows), toolkit pour construire des interfaces graphiques portable sur unix et windows
Boa Constructor
Interface graphique pour créer de manière visuelle une interface en WxPython (similaire à VB ou Delphi)
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()