interface wxPython et sizer

Le
peracciu
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

Pour les sizer :
Je souhaites organiser ma fenêtre (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é grâce a un wx.GridBagSizer.
Mon problème est que tous mes Panel ce placent dans la première case
de ma frame principale.
J'ai essayé 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être
pour les faire apparaitre.
N'y a t il pas méthode refresh ?

Pour les évènements :
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é).
j'ajoute un écouteur
> self.Bind(wx.EVT_CHECKBOX,self.OnPressCheckBox,checkBox)
comment récupérer le label de la boite cliquer dans la méthode
OnPressCheckBox(self,evt) via la variable evt ?

Merci pour votre aide

Cdlt

P.

Voici le code complet, ça 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éer des fonctions
d'appartenances floues
'''
def __init__(self):
'''
'''
wx.Frame.__init__(self, None, -1, title = "idevs Interface")
#### VARIABLE
self.nbNew = 0
#### MENU FILE
menuFichier = wx.Menu(style = wx.MENU_TEAROFF)
menuFichier.Append(wx.ID_OPEN, "&OpentCTRL+o")
menuFichier.Append(wx.ID_FILE, "&NewtCTRL+n")
menuFichier.AppendSeparator()
menuFichier.Append(wx.ID_HELP, "&HelptCTRL+h")
menuFichier.AppendSeparator()
menuFichier.Append(wx.ID_EXIT, "&QuittertCTRL+q")
#### MENU Export
menuExport = wx.Menu(style = wx.MENU_TEAROFF)
menuExport.Append(wx.ID_FILE1, "&.jpegtCTRL+j")
menuExport.Append(wx.ID_FILE2, "&.epstCTRL+e")
menuExport.AppendSeparator()
menuExport.Append(wx.ID_SAVE, "&.xlstCTRL+x")
#### MENU BAR creat & liaison
menuBarre = wx.MenuBar()
menuBarre.Append(menuFichier, "&File")
menuBarre.Append(menuExport, "&Export")
self.SetMenuBar(menuBarre)
#### MENU BAR params
self.barre = 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 = wx.GridSizer(3,2,2,2)
#self.frameSizer = wx.GridBagSizer(1,1)
self.conteneur00 = wx.Panel(self,-1)
self.conteneur10 = wx.Panel(self,-1)
self.conteneur20 = 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 évènement
###
def OnOpen(self,evt):
''' Gestion Evt Menu Open
'''
self.barre.SetStatusText("Open",1)
dlg = wx.FileDialog(self,"select a file",wildcard =
"*.*",style=wx.OPEN)
retour = dlg.ShowModal()
path = dlg.GetPath()
file = dlg.GetFilename()
dlg.Destroy()
###
def OnNew(self,evt):
''' Gestion Evt Menu New
'''
if self.nbNew == 0:
self.barre.SetStatusText("New First Fuzzy Interval",1)
#### CREATION D'OBJET 1 CONTENEUR
#### A
labelA = wx.StaticText(self,-1,label=u'A')
labelA.SetForegroundColour(wx.BLUE)
#### B
labelB = wx.StaticText(self,-1,label=u'B')
labelB.SetForegroundColour(wx.BLUE)
#### psi
labelP = wx.StaticText(self,-1,label=u'Psi')
labelP.SetForegroundColour(wx.BLUE)
#### omega
labelO = wx.StaticText(self,-1,label=u'Omega')
labelO.SetForegroundColour(wx.BLUE)
#### txt
#### A
self.txtA = wx.TextCtrl(self,-1,value=u"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtA)
#### B
self.txtB = wx.TextCtrl(self,-1,value=u"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtB)
#### psi
self.txtP = wx.TextCtrl(self,-1,value=u"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtP)
#### Omega
self.txtO = wx.TextCtrl(self,-1,value=u"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtO)
#### button
buttonFI = wx.Button(self,-1,label="Enter")
self.Bind(wx.EVT_BUTTON,self.OnButtonClickFI,buttonFI)
#### EEM
#### label EEM
labelEEM = wx.StaticText(self,-1,label=u'EEM')
labelEEM.SetForegroundColour(wx.BLACK)
#### txt
self.txtEEM = wx.TextCtrl(self,-1,value=u"0.5")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnterEEM,self.txtEEM)
#### button
buttonEEM = wx.Button(self,-1,label="Enter")
self.Bind(wx.EVT_BUTTON,self.OnButtonClickEEM,buttonEEM)
### label
self.labelEEMR = wx.StaticText(self,-1,label=u'____')
self.labelEEMR.SetForegroundColour(wx.RED)
#### AJOUT
self.panelSizer = 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+= 1
elif self.nbNew == 1:
self.barre.SetStatusText("New Second Fuzzy Interval",1)
#### CREATION D'OBJET 2nd CONTENEUR
#### A
labelA2 = wx.StaticText(self,-1,label=u'A')
labelA2.SetForegroundColour(wx.BLUE)
#### B
labelB2 = wx.StaticText(self,-1,label=u'B')
labelB2.SetForegroundColour(wx.BLUE)
#### psi
labelP2 = wx.StaticText(self,-1,label=u'Psi')
labelP2.SetForegroundColour(wx.BLUE)
#### omega
labelO2 = wx.StaticText(self,-1,label=u'Omega')
labelO2.SetForegroundColour(wx.BLUE)
#### txt
#### A
self.txtA2 = wx.TextCtrl(self,-1,value=u"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtA2)
#### B
self.txtB2 = wx.TextCtrl(self,-1,value=u"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtB2)
#### psi
self.txtP2 = wx.TextCtrl(self,-1,value=u"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtP2)
#### Omega
self.txtO2 = wx.TextCtrl(self,-1,value=u"0.0")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnter,self.txtO2)
#### button
buttonFI2 = wx.Button(self,-1,label="Enter")
self.Bind(wx.EVT_BUTTON,self.OnButtonClickFI,buttonFI2)
#### EEM
#### label EEM
labelEEM2 = wx.StaticText(self,-1,label=u'EEM')
labelEEM2.SetForegroundColour(wx.BLACK)
#### txt
self.txtEEM2 = wx.TextCtrl(self,-1,value=u"0.5")
self.Bind(wx.EVT_TEXT_ENTER,self.OnPressEnterEEM,self.txtEEM2)
#### button
buttonEEM2 = wx.Button(self,-1,label="Enter")
self.Bind(wx.EVT_BUTTON,self.OnButtonClickEEM,buttonEEM2)
### label
self.labelEEMR2 = wx.StaticText(self,-1,label=u'____')
self.labelEEMR2.SetForegroundColour(wx.RED)
#### AJOUT
self.panelSizer2 = 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 = wx.StaticText(self,-1,label=u'Operation')
labelOp.SetForegroundColour(wx.BLUE)
self.panelSizer3 = wx.GridBagSizer()
self.panelSizer3.Add(labelOp,(0,0),(1,1),wx.ALIGN_CENTRE)
self.cbTxt = {0:'+',1:'-',2:'*',3:'/',4:'%',5:'**',6:'//'}
for i in self.cbTxt:
checkBox = wx.CheckBox(self,i,label=u''+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+= 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 = 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 = wx.ICON_INFORMATION)
retour = 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 = " %s " % evt.GetSize()
self.SetTitle("idevs Interface"+txt)
evt.Skip() # libère l'écoute
###
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 = idevsShow()
fen.Show(True)
self.SetTopWindow(fen)
return True

app = MonApp()
app.MainLoop()
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Amaury Forgeot d'Arc
Le #8946821
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
peracciu
Le #9725641
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
peracciu
Le #9734221
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.
Publicité
Poster une réponse
Anonyme