IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxPython Discussion :

problème wx.RadioBox et Bindage multiple


Sujet :

wxPython

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Par défaut problème wx.RadioBox et Bindage multiple
    Salut à tous,

    Voilà, j'ai besoin d'une wx.RadioBox pour permettre à l'utilisateur de choisir entre plusieurs éléments. Niveau fonctionnement, c'est OK, par contre niveau graphique, cela n'est pas très joli, je m'explique :

    Mon application compte X wx.TextCtrl comportant chacun un texte différent. Tous ces TextCtrl sont alignés verticalement grâce à un wx.GridBagSizer sur la colonne 1 et sur la ligne X. Quand je crée mon wx.RadioBox dans la colonne 2 avec X boutons verticaux, eh bien tous ces boutons sont beaucoup trop proches. Je voudrais qu'ils soient en face de mes TextCtrl, autrement dit il faudrait régler l'espacement vertical entre chaque bouton pour que ca colle.

    Je sais qu'on pourrait aussi utiliser tout simplement une série de X wx.RadioButton et les placer dans la colonne 2 sur la ligne X, mais du point de vue simplicité de programmation, il est quand même plus confortable d'utiliser une RadioBox toute faite.


    Voilà voilà, j'espère avoir été assez clair !
    Merci pour vos réponses

  2. #2
    Membre Expert Avatar de pacificator
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 074
    Par défaut
    Salut,

    tu peux consulter la doc en ligne de wxPython (qui est celle de wxWidgets qu'il faut un peu adapter cf ce tutoriel), le constructeur du wx.GridBagSizer prend en argument les espacements verticaux et horizontaux.

    Voilà voilà, j'espère avoir été assez clair !
    Pas trop... mais un bout de code pourrait aider

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Par défaut
    Salut,

    En effet, lol je crois que je n'ai pas été assez clair
    En tout cas merci d'avoir répondu

    Je vais donc ajouter un morceau de code, je vais utiliser une RadioBox toute faite avec 5 options :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    class MainApp(wx.App):
          def OnInit(self):
     
                for k in range(1,6):
                      self.liste_textctrl.append("self.textctrl"+str(k))
     
                self.fen1=wx.Frame(None,-1,title="MyFrame",\
    size=(725,585),style=wx.DEFAULT_FRAME_STYLE)
                self.pan1=wx.Panel(self.fen1,-1,size=self.fen1.GetClientSize())
                self.sizer1=wx.GridBagSizer(10,10)
     
                self.radio=wx.RadioBox(self.pan1,-1,label="Liste des Choix",\
    size=(50,100),choices=["Choix 1","Choix 2","Choix 3","Choix 4",\
    "Choix 5"],majorDimension=5,style=wx.RA_SPECIFY_ROWS)
                self.sizer1.Add(self.radio,pos=(1,1),span=(5,1))
     
                      for k in range(0,5):
                            self.liste_textctrl[k]=wx.TextCtrl(self.pan3,-1,value="Choix "+str(k+1),size=(350,20))
                            self.sizer3.Add(self.liste_textctrl[k],pos=(k+1,2),flag=wx.ALIGN_CENTRE)
     
     
                self.fen1.SetSizer(self.sizer1)
                self.fen1.Show(True)
                self.SetTopWindow(self.fen1)
                self.fen1.Centre()
                return True
    Et là, qu'est ce que je vois ? Arf ... Ca ne colle pas, graphiquement, les TextCtrl ne sont pas alignées avec les différents choix du RadioBox.

    Ma question était de savoir s'il était possible d'espacer verticalement les différents choix du RadioBox de manière à ce qu'ils soient en face de mes TextCtrl.

    Merci bcp

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Par défaut
    Mon premier problème n'a pas l'air d'inspirer grand monde :p

    J'ai réfléchi et à la place d'une RadioBox toute faite, j'utilise plusieurs RadioButton qu'on peut placer avec un wx.GridBagSizer, mais cela n'est vraiment pas simple du tout ... Résultat, j'ai un deuxième problème ... J'ai fait les recherches dans le forum, j'ai déjà vu un problème similaire à celui-ci mais il n'a pas été Résolu, alors je le remet au goût du jour

    Pour ce faire, j'ai crée des images de mes RadioButton dans une liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    self.liste_radio=[]
    for k in range(1,21):
          self.liste_radio.append("self.radio"+str(k))
    Je crée mes RadioButton (j'utilise un GridBagSizer) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for k in range(1,20):
          self.lradio[k]=wx.RadioButton(self.pan3,-1,label="Choix "+self.alpha[k])
          self.sizer3.Add(self.lradio[k],pos=(k+3,1),flag=wx.ALIGN_LEFT)
          self.Bind(wx.EVT_RADIOBUTTON,lambda x:self.onRadioClicked(val=k),self.liste_radio[k])
    Et voici la fonction correspondante : (je précise que ma self.liste est une liste dans laquelle je stocke les données des différents RadioButton)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def onRadioClicked(self,val,evt=wx.Event):
          selection=self.liste_radio[val].GetValue()
          self.liste[3][val]=selection
    Jusque là tout va bien.

    SI j'ai bien compris comment fonctionne la boucle for(), alors l'équivalent de la dernière ligne devrait être ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    self.Bind(wx.EVT_RADIOBUTTON,self.onRadioClicked(val=0),self.liste_radio[0])
    self.Bind(wx.EVT_RADIOBUTTON,self.onRadioClicked(val=1),self.liste_radio[1])
    self.Bind(wx.EVT_RADIOBUTTON,self.onRadioClicked(val=2),self.liste_radio[2])
     .                                 .                              .                        .
     .                                 .                              .                        .
     .                                 .                              .                        .
    self.Bind(wx.EVT_RADIOBUTTON,self.onRadioClicked(val=19),self.liste_radio[19])
    Et voici le problème : lors d'un Bindage multiple, la valeur qui ressort à chaque fois est la dernière occurence de ma boucle For(), c'est à dire 19 (que j'ai vérifié en faisant un print val dans ma fonction onRadioClicked)

    Je ne sais pas si quelqu'un parviendra à m'aider puisque ce problème n'avais pas été résolu dans le passé, mais je tente ma chance quand même

    Merci à tous !

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 84
    Par défaut
    Bonjour,

    Ayant parcouru un peu ton topic, je ne peux pas t'aider sur le radiobox, par contre, sur ta dernière question, as tu essayer de rajouter un self.update pour actualisation l'affichage?
    Tu essaies seulement avec deux bouton voir déjà si ca marche.

    Je viens de voir autre chose.

    Tu as pas dit que tu voulais disposer tes boutons aligné en verticale?
    Au niveau de self.sizer3.Add(self.lradio[k],pos=(k+3,1),flag=wx.ALIGN_LEFT)

    tu fais bouger ton x au lieu de y, mais bon, je peux me tromper?Si j'ai un moment je testerai ce que ca donne.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Par défaut
    Salut,

    Merci d'avoir répondu !

    Tu as pas dit que tu voulais disposer tes boutons aligné en verticale?
    Au niveau de self.sizer3.Add(self.lradio[k],pos=(k+3,1),flag=wx.ALIGN_LEFT)
    En effet, je veux disposer mes boutons verticalement. On construit un wx.GridBagSizer en ajoutant les widgets de cette façon :
    wx.Sizer.Add(wx.Widget, pos=wx.GBPosition)

    wxGBPosition(int row, int col)
    Construct a new wxGBPosition, optionally setting the row and column. The default is (0,0).

    Ce n'est pas le x que je fais varier, mais le numéro de la ligne (donc en quelque sorte le Y si on voit ça par rapport à un axe).

    --------------------------------------------------------------------------

    Quand à mon petit problème, ce n'est pas une question d'affichage, le self.Update() ne serait pas utile.

    Lorsque j'effectue le Bindage à l'aide de ma boucle for(), tous mes boutons sont liés à la même variable, c'est à dire à la dernière occurence de ma boucle for(). Ici, c'est 19, puisque la dernière occurence de range(0,20), c'est 19) C'est un peu comme si j'avais écrit ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    self.Bind(wx.EVT_RADIOBUTTON,self.onRadioClicked(val=19),self.liste_radio[0])
    self.Bind(wx.EVT_RADIOBUTTON,self.onRadioClicked(val=19),self.liste_radio[1])
    self.Bind(wx.EVT_RADIOBUTTON,self.onRadioClicked(val=19),self.liste_radio[2])
     .                                 .                              .                        .
     .                                 .                              .                        .
     .                                 .                              .                        .
    self.Bind(wx.EVT_RADIOBUTTON,self.onRadioClicked(val=19),self.liste_radio[19])
    (Observe la valeur du paramètre val) Pourtant, moi ce que je veux c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    self.Bind(wx.EVT_RADIOBUTTON,self.onRadioClicked(val=0),self.liste_radio[0])
    self.Bind(wx.EVT_RADIOBUTTON,self.onRadioClicked(val=1),self.liste_radio[1])
    self.Bind(wx.EVT_RADIOBUTTON,self.onRadioClicked(val=2),self.liste_radio[2])
     .                                 .                              .                        .
     .                                 .                              .                        .
     .                                 .                              .                        .
    self.Bind(wx.EVT_RADIOBUTTON,self.onRadioClicked(val=19),self.liste_radio[19])
    En tout cas merci de ta réponse !

    En espérant que tu pourras m'aider,

    Lotendan

  7. #7
    Membre chevronné
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Par défaut
    Bonjour,
    Pourquoi ne pas utiliser les Id ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    import wx
     
    class MainApp(wx.App):
        def OnInit(self):
            self.liste_textctrl=[]
            self.fen1=wx.Frame(None,-1,title="MyFrame",size=(725,585),style=wx.DEFAULT_FRAME_STYLE)
            self.pan1=wx.Panel(self.fen1,-1,size=self.fen1.GetClientSize())
            self.sizer1=wx.GridBagSizer(10,10)
     
            for k in range(0,15):
                radio=wx.RadioButton(self.pan1,id=k,label="Choix "+str(k+1))
                self.sizer1.Add(radio,pos=(k+1,1),flag=wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL)
                self.Bind(wx.EVT_RADIOBUTTON,self.onRadioClicked,radio)
     
            for k in range(0,15):
                text=wx.TextCtrl(self.pan1,-1,value="Choix "+str(k+1),size=(350,20))
                self.liste_textctrl.append(text)
                self.sizer1.Add(text,pos=(k+1,2),flag=wx.ALIGN_CENTRE)
     
            self.fen1.SetSizer(self.sizer1)
            self.fen1.Show(True)
            self.SetTopWindow(self.fen1)
            self.fen1.Centre()
            return True
     
        def onRadioClicked(self,event=None):
            a=event.GetId()
            selection=self.liste_textctrl[a].GetValue()
            print selection
     
    app = MainApp(0)
    app.MainLoop()

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Par défaut
    Salut,

    Je viens de voir ta réponse à mon message.
    Merci d'avoir répondu !!

    Dès que j'aurai plus de temps je testerai ton code, et si ca marche je passerai sur Résolu.

    A bientot ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [BO V5] Problème Liste de valeur choix multiple ou %
    Par bastoonet dans le forum Deski
    Réponses: 3
    Dernier message: 09/10/2007, 11h10
  2. VB6 - problème avec listbox a selection multiple
    Par captainamerica75 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/05/2007, 15h04
  3. Réponses: 19
    Dernier message: 13/07/2006, 13h35
  4. Réponses: 2
    Dernier message: 27/05/2006, 12h13
  5. Problème entre 2 listbox à selection multiple
    Par SoaB dans le forum Général JavaScript
    Réponses: 24
    Dernier message: 24/10/2005, 16h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo