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 :

Probleme de taille d'un sizer lors de l'ajout d'objets


Sujet :

wxPython

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Probleme de taille d'un sizer lors de l'ajout d'objets
    Bonjour,

    Pour un projet sur lequel je suis, j'ai besoin de modifier le contenu d'un sizer dans une ScrolledWindow. Lorsque je rajoute des lignes au sizer, elles viennent couvrir ce qu'il y a en dessous si cela depasse de la place alouée au sizer et la barre de defilement disparait. Il faut redimensionner la fenetre pour retrouver un resultat normal.

    Voici mon code:
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # generated by wxGlade 0.6.3 on Sun Feb 28 00:52:37 2010
     
    import wx
     
    # begin wxGlade: extracode
    # end wxGlade
     
     
     
    class mypanel(wx.ScrolledWindow):
        def __init__(self, *args, **kwds):
            # begin wxGlade: mypanel.__init__
            kwds["style"] = wx.TAB_TRAVERSAL
            wx.ScrolledWindow.__init__(self, *args, **kwds)
            self.label_2 = wx.StaticText(self, -1, "Yoooooooooooooooooooooooooooooo")
     
            self.__set_properties()
            self.__do_layout()
            # end wxGlade
            self.redo_layout()
     
        def __set_properties(self):
            # begin wxGlade: mypanel.__set_properties
            self.SetScrollRate(10, 10)
            # end wxGlade
     
        def __do_layout(self):
            # begin wxGlade: mypanel.__do_layout
            sizer_3 = wx.BoxSizer(wx.VERTICAL)
            sizer_3.Add(self.label_2, 0, wx.ADJUST_MINSIZE, 0)
            self.SetSizer(sizer_3)
            sizer_3.Fit(self)
            # end wxGlade
     
        def redo_layout(self):
            sz=self.GetSizer()
            #sz.Clear(1)
            for i in range(10):
                label_2 = wx.StaticText(self, -1, "Yoooooooooooooooooooooooo")
                sz.Add(label_2, 0)
            #self.GetSizer().Clear(1)
            #self.SetSizer(sz,1)
            sz.Fit(self)
     
     
    # end of class mypanel
     
     
    class MyFrame(wx.Frame):
        def __init__(self, *args, **kwds):
            # begin wxGlade: MyFrame.__init__
            kwds["style"] = wx.DEFAULT_FRAME_STYLE
            wx.Frame.__init__(self, *args, **kwds)
            self.panel_1 = mypanel(self, -1)
            self.button_1 = wx.Button(self, -1, "button_1")
            self.label_3 = wx.StaticText(self, -1, "Yeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee")
     
            self.__set_properties()
            self.__do_layout()
     
            self.Bind(wx.EVT_BUTTON, self.OnButton, self.button_1)
            # end wxGlade
     
        def __set_properties(self):
            # begin wxGlade: MyFrame.__set_properties
            self.SetTitle("frame_1")
            self.SetSize((539, 114))
            # end wxGlade
     
        def __do_layout(self):
            # begin wxGlade: MyFrame.__do_layout
            sizer_1 = wx.BoxSizer(wx.VERTICAL)
            sizer_2 = wx.BoxSizer(wx.VERTICAL)
            sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
            sizer_2.Add(self.panel_1, 1, wx.EXPAND, 0)
            sizer_4.Add(self.button_1, 0, wx.ADJUST_MINSIZE, 0)
            sizer_4.Add(self.label_3, 0, wx.ADJUST_MINSIZE, 0)
            sizer_2.Add(sizer_4, 0, wx.EXPAND, 0)
            sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
            self.SetSizer(sizer_1)
            self.Layout()
            # end wxGlade
     
        def OnButton(self, event): # wxGlade: MyFrame.<event_handler>
            #print "Event handler `OnButton' not implemented!"
            #event.Skip()
            self.panel_1.redo_layout()
            self.Refresh()
            #self.GetSizer().Refresh()
     
    # end of class MyFrame
     
     
    if __name__ == "__main__":
        app = wx.PySimpleApp(0)
        wx.InitAllImageHandlers()
        frame_1 = MyFrame(None, -1, size=(510,110))
        app.SetTopWindow(frame_1)
        frame_1.Show()
        app.MainLoop()
    Il suffit de cliquer sur le bouton pour voir le probleme. J'ai beau essayer de mettre des refresh de partout, cela ne fait rien.

    Quelle est la fonction appellée lors d'un redimensionnement de la fenetre qui force à tour redessiner?

    Si quelqu'un a une idée sur comment regler le probleme...

    Merci.

    Edit:
    Bon j'ai trouvé une solution dans ce sujet:
    http://www.developpez.net/forums/d68...e/#post4004556

    En gros il faut faire une fonction qui redimensionne la fenetre puis la remet à sa taille d'origine et ca l'oblige à se rafraichir. C'est un peu crade, mais ca marche.

    Mais j'aimerai bien comprendre pourquoi le sizer deborde sur le reste de la fenetre et comment l'eviter.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonjour,
    En général, c'est qu'il manque un Layout de sizer quelque part. En fait, quand on ajoute dynamiquement un élément à un sizer, il faudrait appliquer Layout sur chaque sizer impacté (en remontant dans la hiérarchie).
    J'ai essayé avec ton code, sans succès. Mais récemment, je suis tombé sur la méthode SetVirtualSizeHints de wx.Sizer, pour les widgets scrollables dans les sizers :
    void SetVirtualSizeHints(wxWindow * window)
    Tell the sizer to set the minimal size of the window virtual area to match the sizer's minimal size. For windows with managed scrollbars this will set them appropriately
    En mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            sz.SetVirtualSizeHints(self)
            sz.Layout()
    à la place de
    dans redo_layout, ça semble fonctionner.
    a+
    J.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup, ca regle mon probleme.

    Pour mon projet, le sz.layout() ne marche pas parce que c'est un FlexGridSizer, mais le
    sz.SetVirtualSizeHints(self) regle le probleme.

    Ca marche au poil!

    Merci encore.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/10/2009, 09h49
  2. [Irrlicht]Problème lors de l'ajout d'objet
    Par _SamSoft_ dans le forum Irrlicht
    Réponses: 0
    Dernier message: 09/06/2008, 20h20
  3. Problème de taille avec les tables
    Par Angelico dans le forum Paradox
    Réponses: 2
    Dernier message: 27/12/2004, 18h38
  4. probleme de taille de title bar
    Par Daniel Spring dans le forum C++Builder
    Réponses: 1
    Dernier message: 15/11/2004, 17h26
  5. [Memo] Probleme de taille...
    Par NoisetteProd dans le forum Composants VCL
    Réponses: 2
    Dernier message: 27/08/2003, 11h42

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