0 votes

Le moyen le plus simple de créer une zone de défilement à l'aide de wxPython ?

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()

1voto

Jon Cage Points 14126

Oups il s'avère que j'ai mal créé mon enfant Windows :

wind = MyCustomWindow(self)

devrait être :

wind = MyCustomWindow(self.scrolling_window)

ce qui signifie que les fenêtres enfant attendaient que la fenêtre de niveau supérieur (le cadre) soit redessinée au lieu d'écouter la fenêtre de défilement. En changeant cela, tout fonctionne à merveille :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X