Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

interface wxPython et sizer

3 réponses
Avatar
peracciu
Bonjour,

Je viens de commencer =E0 travailler avec python et je d=E9veloppe une
petite interface.
J'ai trois principaux probl=E8mes :
- les sizer
- refresh
- et comment utiliser les param=E8tres de m=E9thode =E9couteur

Pour les sizer :
Je souhaites organiser ma fen=EAtre (frame) avec 3 lignes et 2
colonnes, j'utilise donc un wx.GridSizer(3,2). Ensuite dans chaque
case j'ajoute en Panel (conteneur) qui contient divers objet (label,
button, etc.) plac=E9 gr=E2ce a un wx.GridBagSizer.
Mon probl=E8me est que tous mes Panel ce placent dans la premi=E8re case
de ma frame principale.
J'ai essay=E9 tous les Sizer, tous les indices rien ne change !

Lorsque j'ajoute des objets dans ma frame (label, button) ils sont
tous les un sur les autres, il faut que change la taille de la fen=EAtre
pour les faire apparaitre.
N'y a t il pas m=E9thode refresh ?

Pour les =E9v=E8nements :
Je veux ajouter un checkBox a choix unique (case ronde) je ne trouve
pas l'objet, mais en attendant j'utilise un checkBox (case carr=E9).
j'ajoute un =E9couteur
> self.Bind(wx.EVT_CHECKBOX,self.OnPressCheckBox,checkBox)
comment r=E9cup=E9rer le label de la boite cliquer dans la m=E9thode
OnPressCheckBox(self,evt) via la variable evt ?

Merci pour votre aide

Cdlt

P.

Voici le code complet, =E7a doit marcher chez vous :

_____________________________________


import sys,os
import string
from idevs import *

try:
import wx
except ImportError:
raise ImportError,"The wxPython module is required to run this
program."


for spath in ['../Lib']:
if not spath in sys.path: sys.path.append(spath)

## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## #
# #
# CLASS #
# #
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## #
###
class idevsShow(wx.Frame):
''' Classe qui affiche une interface pour cr=E9er des fonctions
d'appartenances floues
'''
def __init__(self):
'''
'''
wx.Frame.__init__(self, None, -1, title =3D "idevs Interface")
#### VARIABLE
self.nbNew =3D 0
#### MENU FILE
menuFichier =3D wx.Menu(style =3D wx.MENU_TEAROFF)
menuFichier.Append(wx.ID_OPEN, "&Open\tCTRL+o")
menuFichier.Append(wx.ID_FILE, "&New\tCTRL+n")
menuFichier.AppendSeparator()
menuFichier.Append(wx.ID_HELP, "&Help\tCTRL+h")
menuFichier.AppendSeparator()
menuFichier.Append(wx.ID_EXIT, "&Quitter\tCTRL+q")
#### MENU Export
menuExport =3D wx.Menu(style =3D wx.MENU_TEAROFF)
menuExport.Append(wx.ID_FILE1, "&.jpeg\tCTRL+j")
menuExport.Append(wx.ID_FILE2, "&.eps\tCTRL+e")
menuExport.AppendSeparator()
menuExport.Append(wx.ID_SAVE, "&.xls\tCTRL+x")
#### MENU BAR creat & liaison
menuBarre =3D wx.MenuBar()
menuBarre.Append(menuFichier, "&File")
menuBarre.Append(menuExport, "&Export")
self.SetMenuBar(menuBarre)
#### MENU BAR params
self.barre =3D wx.StatusBar(self, -1)
self.barre.SetFieldsCount(2)
self.barre.SetStatusWidths([-1,-1])
self.SetStatusBar(self.barre)
#### EVT_MENU
wx.EVT_MENU(self, wx.ID_OPEN, self.OnOpen)
wx.EVT_MENU(self, wx.ID_FILE, self.OnNew)
wx.EVT_MENU(self, wx.ID_HELP, self.OnHelp)
wx.EVT_MENU(self, wx.ID_EXIT, self.OnExit)
wx.EVT_MENU(self, wx.ID_FILE1, self.OnJpeg)
wx.EVT_MENU(self, wx.ID_FILE2, self.OnEps)
wx.EVT_MENU(self, wx.ID_SAVE, self.OnSave)
#### LAYOUT / SIZER
self.frameSizer =3D wx.GridSizer(3,2,2,2)
#self.frameSizer =3D wx.GridBagSizer(1,1)
self.conteneur00 =3D wx.Panel(self,-1)
self.conteneur10 =3D wx.Panel(self,-1)
self.conteneur20 =3D wx.Panel(self,-1)
#self.frameSizer.Add(self.conteneur00, (0,0),(1,1), wx.EXPAND)
#self.frameSizer.Add(self.conteneur10, (1,0),(1,1), wx.EXPAND)
self.frameSizer.Add(self.conteneur00, 0,0, wx.ALIGN_CENTER)
self.frameSizer.Add(self.conteneur10, 1,0, wx.ALIGN_CENTER)
self.frameSizer.Add(self.conteneur20, 2,0, wx.ALIGN_CENTER)
# SIZE
self.SetSizer(self.frameSizer)
self.frameSizer.SetSizeHints(self) # taille mimimal
self.SetSize((600,500))
### EVENT
wx.EVT_SIZE(self,self.onSize) # ecoute un =E9v=E8nement
###
def OnOpen(self,evt):
''' Gestion Evt Menu Open
'''
self.barre.SetStatusText("Open",1)
dlg =3D wx.FileDialog(self,"select a file",wildcard =3D
"*.*",style=3Dwx.OPEN)
retour =3D dlg.ShowModal()
path =3D dlg.GetPath()
file =3D dlg.GetFilename()
dlg.Destroy()
###
def OnNew(self,evt):
''' Gestion Evt Menu New
'''
if self.nbNew =3D=3D 0:
self.barre.SetStatusText("New First Fuzzy Interval",1)
#### CREATION D'OBJET 1 CONTENEUR
#### A
labelA =3D wx.StaticText(self,-1,label=3Du'A')
labelA.SetForegroundColour(wx.BLUE)
#### B
labelB =3D wx.StaticText(self,-1,label=3Du'B')
labelB.SetForegroundColour(wx.BLUE)
#### psi
labelP =3D wx.StaticText(self,-1,label=3Du'Psi')
labelP.SetForegroundColour(wx.BLUE)
#### omega
labelO =3D wx.StaticText(self,-1,label=3Du'Omega')
labelO.SetForegroundColour(wx.BLUE)
#### txt
#### A
self.txtA =3D wx.TextCtrl(self,-1,value=3Du"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtA)
#### B
self.txtB =3D wx.TextCtrl(self,-1,value=3Du"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtB)
#### psi
self.txtP =3D wx.TextCtrl(self,-1,value=3Du"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtP)
#### Omega
self.txtO =3D wx.TextCtrl(self,-1,value=3Du"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtO)
#### button
buttonFI =3D wx.Button(self,-1,label=3D"Enter")
self.Bind(wx.EVT_BUTTON,self.OnButtonClickFI,buttonFI)
#### EEM
#### label EEM
labelEEM =3D wx.StaticText(self,-1,label=3Du'EEM')
labelEEM.SetForegroundColour(wx.BLACK)
#### txt
self.txtEEM =3D wx.TextCtrl(self,-1,value=3Du"0.5")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnterEEM,self.txtEEM)
#### button
buttonEEM =3D wx.Button(self,-1,label=3D"Enter")
self.Bind(wx.EVT_BUTTON,self.OnButtonClickEEM,buttonEEM)
### label
self.labelEEMR =3D wx.StaticText(self,-1,label=3Du'____')
self.labelEEMR.SetForegroundColour(wx.RED)
#### AJOUT
self.panelSizer =3D wx.GridBagSizer()
self.panelSizer.Add(labelA,(0,0),(1,1),wx.ALIGN_CENTRE)
self.panelSizer.Add(labelB,(0,1),(1,1),wx.ALIGN_CENTRE)
self.panelSizer.Add(labelP,(0,2),(1,1),wx.ALIGN_CENTRE)
self.panelSizer.Add(labelO,(0,3),(1,1),wx.ALIGN_CENTRE)
####
self.panelSizer.Add(self.txtA,(1,0),(1,1),wx.EXPAND)
self.panelSizer.Add(self.txtB,(1,1),(1,1),wx.EXPAND)
self.panelSizer.Add(self.txtP,(1,2),(1,1),wx.EXPAND)
self.panelSizer.Add(self.txtO,(1,3),(1,1),wx.EXPAND)
####
self.panelSizer.Add(buttonFI,(2,3),(1,1))
####
self.panelSizer.Add(labelEEM,(3,0),(1,1),wx.ALIGN_CENTRE)
self.panelSizer.Add(self.txtEEM,(3,1),(1,1),wx.EXPAND)
self.panelSizer.Add(buttonEEM,(3,2),(1,1))
self.panelSizer.Add(self.labelEEMR,(3,3),(1,1),wx.ALIGN_CENTRE)
self.conteneur00.SetSizer(self.panelSizer)
####
self.nbNew+=3D 1
elif self.nbNew =3D=3D 1:
self.barre.SetStatusText("New Second Fuzzy Interval",1)
#### CREATION D'OBJET 2nd CONTENEUR
#### A
labelA2 =3D wx.StaticText(self,-1,label=3Du'A')
labelA2.SetForegroundColour(wx.BLUE)
#### B
labelB2 =3D wx.StaticText(self,-1,label=3Du'B')
labelB2.SetForegroundColour(wx.BLUE)
#### psi
labelP2 =3D wx.StaticText(self,-1,label=3Du'Psi')
labelP2.SetForegroundColour(wx.BLUE)
#### omega
labelO2 =3D wx.StaticText(self,-1,label=3Du'Omega')
labelO2.SetForegroundColour(wx.BLUE)
#### txt
#### A
self.txtA2 =3D wx.TextCtrl(self,-1,value=3Du"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtA2)
#### B
self.txtB2 =3D wx.TextCtrl(self,-1,value=3Du"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtB2)
#### psi
self.txtP2 =3D wx.TextCtrl(self,-1,value=3Du"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtP2)
#### Omega
self.txtO2 =3D wx.TextCtrl(self,-1,value=3Du"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtO2)
#### button
buttonFI2 =3D wx.Button(self,-1,label=3D"Enter")
self.Bind(wx.EVT_BUTTON,self.OnButtonClickFI,buttonFI2)
#### EEM
#### label EEM
labelEEM2 =3D wx.StaticText(self,-1,label=3Du'EEM')
labelEEM2.SetForegroundColour(wx.BLACK)
#### txt
self.txtEEM2 =3D wx.TextCtrl(self,-1,value=3Du"0.5")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnterEEM,self.txtEEM2)
#### button
buttonEEM2 =3D wx.Button(self,-1,label=3D"Enter")
self.Bind(wx.EVT_BUTTON,self.OnButtonClickEEM,buttonEEM2)
### label
self.labelEEMR2 =3D wx.StaticText(self,-1,label=3Du'____')
self.labelEEMR2.SetForegroundColour(wx.RED)
#### AJOUT
self.panelSizer2 =3D wx.GridBagSizer()
self.panelSizer2.Add(labelA2,(0,0),(1,1),wx.ALIGN_CENTRE)
self.panelSizer2.Add(labelB2,(0,1),(1,1),wx.ALIGN_CENTRE)
self.panelSizer2.Add(labelP2,(0,2),(1,1),wx.ALIGN_CENTRE)
self.panelSizer2.Add(labelO2,(0,3),(1,1),wx.ALIGN_CENTRE)
####
self.panelSizer2.Add(self.txtA2,(1,0),(1,1),wx.EXPAND)
self.panelSizer2.Add(self.txtB2,(1,1),(1,1),wx.EXPAND)
self.panelSizer2.Add(self.txtP2,(1,2),(1,1),wx.EXPAND)
self.panelSizer2.Add(self.txtO2,(1,3),(1,1),wx.EXPAND)
####
self.panelSizer2.Add(buttonFI2,(2,3),(1,1))
####
self.panelSizer2.Add(labelEEM2,(3,0),(1,1),wx.ALIGN_CENTRE)
self.panelSizer2.Add(self.txtEEM2,(3,1),(1,1),wx.EXPAND)
self.panelSizer2.Add(buttonEEM2,(3,2),(1,1))
self.panelSizer2.Add(self.labelEEMR2,(3,3),(1,1),wx.ALIGN_CENTRE)
self.conteneur10.SetSizer(self.panelSizer2)
####
#### CREATION D'OBJET 2nd CONTENEUR
labelOp =3D wx.StaticText(self,-1,label=3Du'Operation')
labelOp.SetForegroundColour(wx.BLUE)
self.panelSizer3 =3D wx.GridBagSizer()
self.panelSizer3.Add(labelOp,(0,0),(1,1),wx.ALIGN_CENTRE)
self.cbTxt =3D {0:'+',1:'-',2:'*',3:'/',4:'%',5:'**',6:'//'}
for i in self.cbTxt:
checkBox =3D wx.CheckBox(self,i,label=3Du''+self.cbTxt[i])
self.panelSizer3.Add(checkBox,(i,0),(1,1),wx.EXPAND)
self.Bind(wx.EVT_CHECKBOX,self.OnPressCheckBox,checkBox)
self.conteneur20.SetSizer(self.panelSizer3)
####
self.nbNew+=3D 1

else:
self.barre.SetStatusText("Impossible to create more than two
interval",1)


###
def OnHelp(self,evt):
''' Gestion Evt Menu New
'''
self.barre.SetStatusText("Help",1)
dlg =3D wx.MessageDialog(self,
"This interface allows you to define and manipulate fuzzy sets - The
icon 'new' can create 2 sets - The icon 'open' can create a set from a
'.xls' file - The icon 'export' allows you to export functions in
another format",
style =3D wx.ICON_INFORMATION)
retour =3D dlg.ShowModal()
dlg.Destroy()
###
def OnExit(self,evt):
''' Gestion Evt Menu Exit
'''
self.Destroy()
###
def OnJpeg(self,evt):
''' Gestion Evt Menu New
'''
self.barre.SetStatusText("Jpeg",1)
###
def OnEps(self,evt):
''' Gestion Evt Menu New
'''
self.barre.SetStatusText("Eps",1)
###
def OnSave(self,evt):
''' Gestion Evt Menu New
'''
self.barre.SetStatusText("xls",1)
###
def onSize(self,evt):
''' Gestion Evt Frame Size
'''
txt =3D " %s " % evt.GetSize()
self.SetTitle("idevs Interface"+txt)
evt.Skip() # lib=E8re l'=E9coute
###
def OnPressEnter(self,evt):
'''
'''
self.barre.SetStatusText("update or creat a new fuzzy interval")
###
def OnButtonClickFI(self,evt):
'''
'''
self.barre.SetStatusText("update or creat a new fuzzy interval")
###
def OnPressEnterEEM(self,evt):
'''
'''
self.barre.SetStatusText("validity coefficient")
###
def OnButtonClickEEM(self,evt):
'''
'''
self.barre.SetStatusText("EEM result")
self.labelEEMR.SetLabel("resultat")
###
def OnPressCheckBox(self,evt):
'''
'''
self.barre.SetStatusText("choice")
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## #
# #
# MAIN #
# #
## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ##
## #
class MonApp(wx.App):
'''
'''
def OnInit(self):
'''
'''
fen =3D idevsShow()
fen.Show(True)
self.SetTopWindow(fen)
return True

app =3D MonApp()
app.MainLoop()

3 réponses

Avatar
Amaury Forgeot d'Arc
a écrit :
Bonjour,

Je viens de commencer à travailler avec python et je développe une
petite interface.
J'ai trois principaux problèmes :
- les sizer
- refresh
- et comment utiliser les paramètres de méthode écouteur



- D'abord les sizers:
il faut absolument créer les différents labels et boutons sur le panel
correspondant, et non sur la frame principale.
par exemple,
labelA = wx.StaticText(self.conteneur00,-1,label=u'A')
Sinon: toutes les coordonnées sont bien calculées, sauf que le labelA se
retrouve en position (0,0) par rapport à la frame, au lieu d'être en
position (0,0) par rapport à son panel.

- le refresh:
quand on ajoute dynamiquement des composants à une fenêtre, il faut
demander un recalcul de tous les sizers. Essaie avec un
self.Layout()

- un "checkBox a choix unique" s'appelle un wx.RadioButton, qui se
déplace souvent en groupe... tu devrais aussi regarder wx.RadioBox

> comment récupérer le label de la boite cliquer dans la méthode
> OnPressCheckBox(self,evt) via la variable evt ?
evt.GetEventObject.GetLabel()
(enfin je crois, je n'ai pas essayé)

--
Amaury Forgeot d'Arc
Avatar
peracciu
Merci beaucoup pour votre aide.
Changer le parent lors de la création des objets ça marche, mon
problème c'est que le second conteneur ce place a droite du 1er et
non dessous
self.frameSizer.Add(self.conteneur00, 1,0, wx.EXPAND)
self.frameSizer.Add(self.conteneur10, 2,0, wx.EXPAND)
self.frameSizer.Add(self.conteneur20, 3,0, wx.EXPAND)



On regardant le code du 1er poste, j'ai du déplacer ces trois lignes
dans la méthode 'OnNew'

Le self.Layout() marche nickel, Merci

Par contre pour les RadioBox je ne comprend pas leur fonctionnement
lorsque j'en rajoute une il n'y a rien a cliquer, j'ai donc opté pour
un série de RadioButton

for i in self.cbTxt:
radioButton =
wx.RadioButton(self.conteneur20,-1,label=u' '+self.cbTxt[i])
self.panelSizer3.Add(radioButton,(i+1,0),(1,1),wx.EXPAND)
self.Bind(wx.EVT_RADIOBUTTON,self.OnPressRadioButton,radioButton)

mais je n'arrive pas a récupérer le label du bouton sélectionné via la
méthode 'OnPressRadioButton(self,evt)'

Si vous avez une idée, et de même pour l'amélioration de mon code.

Merci beaucoup
Avatar
peracciu
Bonjour,

Merci pour votre réponse elle m'a bien aidé.
Le changement de parent lors de la création d'objet ça marche mieux,
mais j'ai toujours un problème : le second conteneur ce place à droite
du premier et non dessous.
De plus, pour que ça marche j'ai du déplacer ces 3 lignes de code dans
la méthode OnNew, a la fin des tests 1 et 2.
self.frameSizer.Add(self.conteneur00, 1,0, wx.EXPAND)
self.frameSizer.Add(self.conteneur10, 2,0, wx.EXPAND)
self.frameSizer.Add(self.conteneur20, 3,0, wx.EXPAND)



Par contre la méthode self.Layout() marche très bien merci.

Pour les RadioBox je ne comprends pas comment ça marche, car ça
n'affiche rien de sélectionnable dans ma fenêtre, j'utilise donc
plusieurs RadionButton, mais je n'arrive toujours pas a récupérer
leurs label ou leur id via l'évènement joint.
for i in self.cbTxt:
radioButton =
wx.RadioButton(self.conteneur20,-1,label=u' '+self.cbTxt[i])
self.panelSizer3.Add(radioButton,(i+1,0),(1,1),wx.EXPAND)
self.Bind(wx.EVT_RADIOBUTTON,self.OnPressRadioButton,radioButton)

C'est la méthode OnPressRadioButton(self,evt)

Mon problème de positionnement de sizer en entraîne d'autre comme par
exemple j'aimerais ajouter un label (pour test) dans la case 0 1
(première ligne second colonne). Méthode OnPressEnter elle gère les
évènements des boutons entrer. A ce propos je veux utiliser une seule
méthode pour gérer les 2 boutons, comment savoir lequel a été cliqu é,
c'est toujours avec la variable evt de la méthode OnPressEnter() mais
je ne sais pas quoi utiliser !!!

#label = wx.StaticText(self.conteneur01,-1,label=u'Fonction')
#self.frameSizer.Add(self.conteneur01, 0,1, wx.EXPAND)
label = wx.StaticText(self,-1,label=u'Fonction')
self.frameSizer.Add(label, 0,1, wx.ALIGN_CENTER)
self.Layout()

Pour l'ajout du label, que j'utilise un conteneur ou pas ça ne
m'affiche rien !!!

Merci beaucoup pour votre aide.

Cdlt P.