Bon, je veux afficher une série de fenêtres dans des fenêtres et faire défiler le tout. J'ai cherché dans la documentation sur les wxWidgets et un tas d'exemples provenant de diverses sources sur l'internet. La plupart d'entre eux semblent impliquer qu'une wx.ScrolledWindow devrait fonctionner si je lui passe simplement un groupe imbriqué de sizers( ?):
La méthode la plus automatique et la plus récente consiste à laisser les sizers déterminer la zone de défilement, ce qui est désormais la valeur par défaut lorsque vous définissez un sizer intérieur dans une wxScrolledWindow avec wxWindow::SetSizer. La zone de défilement sera définie à la taille demandée par le sizer et les barres de défilement seront attribuées pour chaque orientation en fonction de leur besoin et de l'incrément de défilement défini par wxScrolledWindow::SetScrollRate.
...mais tous les exemples que j'ai vus semblent utiliser les anciennes méthodes énumérées comme moyens de réaliser le défilement. J'ai réussi à faire fonctionner quelque chose de basique, mais dès que l'on commence à faire défiler, on perd les fenêtres enfant :
import wx
class MyCustomWindow(wx.Window):
def __init__(self, parent):
wx.Window.__init__(self, parent)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.SetSize((50,50))
def OnPaint(self, event):
dc = wx.BufferedPaintDC(self)
dc.SetPen(wx.Pen('blue', 2))
dc.SetBrush(wx.Brush('blue'))
(width, height)=self.GetSizeTuple()
dc.DrawRoundedRectangle(0, 0,width, height, 8)
class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.scrolling_window = wx.ScrolledWindow( self )
self.scrolling_window.SetScrollRate(1,1)
self.scrolling_window.EnableScrolling(True,True)
self.sizer_container = wx.BoxSizer( wx.VERTICAL )
self.sizer = wx.BoxSizer( wx.HORIZONTAL )
self.sizer_container.Add(self.sizer,1,wx.CENTER,wx.EXPAND)
self.child_windows = []
for i in range(0,50):
wind = MyCustomWindow(self.scrolling_window)
self.sizer.Add(wind, 0, wx.CENTER|wx.ALL, 5)
self.child_windows.append(wind)
self.scrolling_window.SetSizer(self.sizer_container)
def OnSize(self, event):
self.scrolling_window.SetSize(self.GetClientSize())
if __name__=='__main__':
app = wx.PySimpleApp()
f = TestFrame()
f.Show()
app.MainLoop()