2009-02-23 9 views
0

Ok, donc je veux afficher une série de fenêtres dans les fenêtres et faire défiler tout le lot. J'ai été la chasse à travers the wxWidgets documentation et une charge d'exemples de diverses sources sur t'internet. La plupart de ceux qui semblent impliquer que wx.ScrolledWindow devrait fonctionner si je viens de passer un groupe imbriqué de calibreurs (?):Le moyen le plus simple de créer une zone de défilement en utilisant wxPython?

La façon la plus automatique et plus récent est de laisser simplement calibreurs déterminer le défilement area.This est maintenant la valeur par défaut lorsque vous définissez un sizer intérieur dans wxScrolledWindow avec wxWindow :: SetSizer. La zone de défilement sera définie à la taille demandée par le dimensionneur et les barres de défilement seront affectées à 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 listées comme des moyens de réaliser un défilement. J'ai quelque chose de travail de base, mais dès que vous commencez à faire défiler vous perdez les fenêtres de l'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() 
+0

Avez-vous plus de chance si vous utilisez wx.lib.scrolledpanel à la place? Voir la démo wxPython pour un exemple. (C'est sous "Plus de Windows/Contrôles") –

+0

Juste essayé cela et cela n'a fait aucune différence. –

Répondre

0

Oops .. Il se trouve que je créais mes fenêtres enfants mal:

wind = MyCustomWindow(self) 

devrait être :

wind = MyCustomWindow(self.scrolling_window) 

..which signifiait les fenêtres enfants attendaient la fenêtre de niveau supérieur (le cadre) à redessinées au lieu d'écouter la fenêtre de défilement. Changer cela fait que tout fonctionne à merveille :)