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 de GridBagSizer


Sujet :

wxPython

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 172
    Par défaut Problème de GridBagSizer
    Bonjour à tous,

    Voici mon problème du jour, (je viens de retaper un petit exemple pour ne pas devoir poster tout le code qui est très long)

    Je voudrais lors d'une saisie dans un TextCtrl, récupérer la valeur de cette saisie et sur l'évènement EVT_TXT_ENTER vérifier si je récupère bien la valeur entrée et surtout placer cette dernière dans un GridBagSizer...La valeur est bien récupérée sur l'évènement cependant ça ne se place pas dans le GridBagSizer (on voit la valeur entrée qui s'affiche et reste en haut à gauche...)Pourtant, le comble est que si l'on répète l'évènement (en appuyant une deuxième fois sur entrée) il sort une erreur qui dit qu'un objet est déjà présent dans cette cellule du GridBagSizer....

    Voilà, du coup je n'y comprends rien...

    Aidez moiiiiiiiiiiiii svp !!!

    Merci d'avance à tous ceux qui prendront le temps de regarder ça

    Voilà un code (tapé à la va vite mais qui tourne) qui retranscrit mon problème :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    # -*- coding: cp1252 -*-
    import wx
     
    class MainFrame(wx.Frame):
         def __init__(self):
             wx.Frame.__init__(self, None, title="TestGBS",size=(800,600))
             self.Maximize()
             self.Center()#Centre la frame
             # On crée un panel avec un Notebook dessus
             p = wx.Panel(self)
             nb = wx.Notebook(p)
             # On met le tout dans un sizer
             sizer = wx.BoxSizer()
             sizer.Add(nb, 1, wx.EXPAND)
             p.SetSizer(sizer)
             page1=PageUn(nb)
             nb.AddPage(page1, "PROBLEME DE GRID BAG SIZER >.<")
     
    class PageUn(wx.Panel):
         def __init__(self, parent):
             global TapeMot,box1
             wx.Panel.__init__(self, parent)
             self.TapeMot = wx.TextCtrl(self, -1, "Entrez un mot",(5,5),size=(125, -1),style=wx.TE_PROCESS_ENTER)
             self.Bind(wx.EVT_TEXT_ENTER,self.VerifMot,self.TapeMot)
             txtMot = wx.StaticText(self, -1, "On affiche le mot tapé :")
     
             box1 = wx.GridBagSizer(3,3) # Créer une box de 3lignes 3colonnes
             box1.SetEmptyCellSize((20,20))
             box1.Add(self.TapeMot,(0,0))
             box1.Add(txtMot,(0,2))
     
             box = wx.StaticBox(self, -1, "Gestion Menu des mots XD :")
             sizer1 = wx.StaticBoxSizer(box, wx.HORIZONTAL)
             sizer1.Add(box1, 1, wx.CENTRE|wx.ALL, 10)
     
             #--------Ajustement des sizers----------
             mainSizer = wx.BoxSizer(wx.VERTICAL)
             mainSizer.Add(sizer1, 0,wx.ALL, 10)
             self.SetSizer(mainSizer)
     
     
         def VerifMot(self,event):
             global TapeMot,box1
             MotEntre = self.TapeMot.GetValue()
             print MotEntre
             box1.Add(wx.StaticText(self,-1,MotEntre),(2,2))#On place le mot entré sous "Entrez un mot"
     
     
     
    if __name__ == "__main__":
         app = wx.App()
         frame = MainFrame() #Instanciation de la frame principale.
         frame.Show(True)
         app.MainLoop() #Fais tourner l'application.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 328
    Par défaut
    Bonjour,

    J'ai lu rapidement mais le problème ne serait-il pas que tu essayes de placer un widget dans la même cas du sizer à chaque fois ? (Voir ligne 46). Fais peut-être quelque chose du style self.numLigne+=1 pour te déplacer dans le sizer à chaque insertion.

    A +

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 172
    Par défaut
    En fait le problème ne se situe pas au niveau de l'erreur : "si l'on répète l'évènement (en appuyant une deuxième fois sur entrée) il sort une erreur qui dit qu'un objet est déjà présent dans cette cellule du GridBagSizer...." Au final je n'aurai pas besoin de répéter l'évènement plusieurs fois

    Mais du fait que tout simplement dès le départ il ne place pas la valeur trouvée au bon endroit

    Le bout de code est fonctionnel pour tester, si tu entres un mot tu verras qu'au lieu de se placer à l'endroit voulu, il se retrouve en haut à gauche

  4. #4
    Membre éprouvé
    Inscrit en
    Octobre 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 92
    Par défaut
    Bonjour,

    C'est tout à fait normal .

    En réalité ton code est bon et comme l'indique ton message d'erreur, le texte est bien entré dans le widget qui se trouve à l'endroit demandé dans le sizer !

    Le seul problème, c'est que ton affichage ne s'adapte pas automatiquement à la situation nouvelle qui résulte du fait que tu ajoutes à la volée un nouveau widget (ligne 46) ; il n'y a pas d'actualisation automatique en un tel cas : c'est un comportement normal de Wxpython.

    Si tu redimensionnes à la souris ta boîte, tu vas d'ailleurs voir que l'affichage s'actualise correctement !

    Pour régler le problème et forcer le sizer à s'adapter tout seul et tout de suite, ajoute ceci ligne 47 :

    self.Layout()


    Ceci dit je te déconseille de créer ton widget à la volée. Je te suggère de le créer vide ligne 26 et de le mettre dans le sizer dès le départ.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 172
    Par défaut
    Je ne comprends pas l'idée de créer le widget vide en ligne 26

    J'ai quelques lacunes

    En tout cas merci beaucoup de répondre et de m'aider

    Edit : Super le coup du self.Layout() marche nickel !!!

  6. #6
    Membre éprouvé
    Inscrit en
    Octobre 2006
    Messages
    92
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 92
    Par défaut
    Citation Envoyé par Fawn_noOb_wxPython Voir le message
    Je ne comprends pas l'idée de créer le widget vide en ligne 26
    Parce que, s'il est présent dès le départ, le sizer tient compte de cette présence dès le départ, il n'a pas besoin de s'adapter. Tu verras à l'usage que c'est beaucoup plus facile à gérer. C'est une solution à privilégier à chaque fois que c'est possible (là où ça devient difficile et où il faut revenir à de la création à la volée, c'est sur les IHM dynamiques complexes. J'en fais beaucoup ).

    Ta procédure d'évènement ne servira qu'à une chose : remplir le widget, et non plus à le créer. Du coup, forcément, tu n'auras plus de message qui te dira "ah ben je peux pas créer ce widget à tel emplacement becôse cet emplacement est déjà occupé !"

    Citation Envoyé par Fawn_noOb_wxPython Voir le message
    Edit : Super le coup du self.Layout() marche nickel !!!
    Oui mais attention ! Là, tu restes à une procédure d'évènement qui crée ton StaticText, donc la première fois ça marche. Mais si tu rentres de nouveau du texte dans le champ de saisie, là ça va planter ! Car tu relances la procédure d'évènement qui comprend la création d'un StaticText à un endroit dans le sizer où tu en as déjà créé un...

    Dis-toi que les widgets dans un emplacement de sizer c'est comme le Highlander : à la fin il ne peut y en avoir qu'un .

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 172
    Par défaut
    D'accord, alors je comprends l'idée, on place d'abord le widget vide dans le sizer puis on le modifie, mais euh en pratique je vois pas du tout ce que ça donne

    Edit : De plus si je veux changer la police de caractère ça ne marche plus... Par exemple à la ligne 46 si je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    box1.Add(wx.StaticText(self,-1,MotEntre).SetFont(wx.Font(12, wx.DEFAULT , wx.NORMAL, wx.BOLD,False, "Tahoma" )),(2,2))
    Il me renvoie une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TypeError: wx.Window, wx.Sizer, wx.Size, or (w,h) expected for item
    Pourquoi ???

    J'essaie de faire autrement mais ça ne marche pas, par exemple je viens de faire comme ceci :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    # -*- coding: cp1252 -*-
    import wx
     
    class MainFrame(wx.Frame):
         def __init__(self):
             wx.Frame.__init__(self, None, title="TestGBS",size=(800,600))
             self.Maximize()
             self.Center()#Centre la frame
             # On crée un panel avec un Notebook dessus
             p = wx.Panel(self)
             nb = wx.Notebook(p)
             # On met le tout dans un sizer
             sizer = wx.BoxSizer()
             sizer.Add(nb, 1, wx.EXPAND)
             p.SetSizer(sizer)
             page1=PageUn(nb)
             nb.AddPage(page1, "PROBLEME DE GRID BAG SIZER >.<")
     
    class PageUn(wx.Panel):
         def __init__(self, parent):
             global TapeMot,MotModif,box1
             wx.Panel.__init__(self, parent)
             self.TapeMot = wx.TextCtrl(self, -1, "Entrez un mot",(5,5),size=(125, -1),style=wx.TE_PROCESS_ENTER)
             self.Bind(wx.EVT_TEXT_ENTER,self.VerifMot,self.TapeMot)
             txtMot = wx.StaticText(self, -1, "On affiche le mot tapé :")
             MotVide = ""
             MotModif = wx.StaticText(self,-1,MotVide)
     
             box1 = wx.GridBagSizer(3,3) # Créer une box de 3lignes 3colonnes
             box1.SetEmptyCellSize((20,20))
             box1.Add(self.TapeMot,(0,0))
             box1.Add(txtMot,(0,2))
             box1.Add(MotModif,(2,2))
     
             box = wx.StaticBox(self, -1, "Gestion Menu des mots XD :")
             sizer1 = wx.StaticBoxSizer(box, wx.HORIZONTAL)
             sizer1.Add(box1, 1, wx.CENTRE|wx.ALL, 10)
     
             #--------Ajustement des sizers----------
             mainSizer = wx.BoxSizer(wx.VERTICAL)
             mainSizer.Add(sizer1, 0,wx.ALL, 10)
             self.SetSizer(mainSizer)
     
     
         def VerifMot(self,event):
             global TapeMot,MotModif,box1
             #MotEntre = self.TapeMot.GetValue()
             #print MotEntre
             #MotModif = wx.StaticText(self,-1,MotEntre).SetFont(wx.Font(12, wx.DEFAULT , wx.NORMAL, wx.BOLD,False, "Tahoma" ))
             MotModif=self.TapeMot.GetValue()#On place le mot entré sous "Entrez un mot"
             print type(MotModif)
             self.Layout()
     
     
     
    if __name__ == "__main__":
         app = wx.App()
         frame = MainFrame() #Instanciation de la frame principale.
         frame.Show(True)
         app.MainLoop() #Fais tourner l'application.
    Mais bien que MotModif change de valeur, celle ci ne s'affiche pas dans le sizer

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

Discussions similaires

  1. [Python 2.X] Problème d'affichage d'une GridBagSizer
    Par abdel792 dans le forum wxPython
    Réponses: 1
    Dernier message: 11/11/2014, 10h37
  2. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  3. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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