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.