2009-02-18 10 views
0

Je crée un petit utilitaire wxPython pour la première fois, et je suis bloqué sur un problème.wxPython - Redessine Erreur lors du remplacement du panneau de wxFrame

Je voudrais ajouter des composants à un cadre déjà créé. Pour ce faire, je détruis l'ancien panneau du cadre et crée un nouveau panneau avec tous les nouveaux composants. 1: Y a-t-il une meilleure façon d'ajouter dynamiquement du contenu à un panneau?

2: Pourquoi, dans l'exemple suivant, est-ce que j'obtiens une erreur de rafraîchissement étrange dans laquelle dans le panneau est dessiné seulement dans le coin supérieur gauche, et quand redimensionné, le panneau est dessiné correctement? (WinXP, Python 2.5, dernière wxPython)

Merci pour votre aide!

import wx 

class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, 'TimeTablr') 


     #Variables 
     self.iCalFiles = ['Empty', 'Empty', 'Empty'] 
     self.panel = wx.Panel(self, -1) 
     self.layoutElements()   


    def layoutElements(self): 
     self.panel.Destroy() 
     self.panel = wx.Panel(self, -1) 
     #Buttons 
     self.getFilesButton = wx.Button(self.panel, 1, 'Get Files') 
     self.calculateButton = wx.Button(self.panel, 2, 'Calculate') 
     self.quitButton = wx.Button(self.panel, 3, 'Quit Application') 

     #Binds 
     self.Bind(wx.EVT_BUTTON, self.Quit, id=3) 
     self.Bind(wx.EVT_BUTTON, self.getFiles, id=1) 

     #Layout Managers 
     vbox = wx.BoxSizer(wx.VERTICAL) 

     #Panel Contents 
     self.ctrlsToDescribe = [] 
     self.fileNames = [] 
     for iCalFile in self.iCalFiles: 
      self.ctrlsToDescribe.append(wx.TextCtrl(self.panel, -1)) 
      self.fileNames.append(wx.StaticText(self.panel, -1, iCalFile)) 

     #Add Components to Layout Managers 
     for i in range(0, len(self.ctrlsToDescribe)): 
      hboxtemp = wx.BoxSizer(wx.HORIZONTAL) 
      hboxtemp.AddStretchSpacer() 
      hboxtemp.Add(self.fileNames[i], 1, wx.EXPAND) 
      hboxtemp.AddStretchSpacer() 
      hboxtemp.Add(self.ctrlsToDescribe[i], 2, wx.EXPAND) 
      hboxtemp.AddStretchSpacer() 
      vbox.Add(hboxtemp) 

     finalHBox = wx.BoxSizer(wx.HORIZONTAL) 
     finalHBox.Add(self.getFilesButton) 
     finalHBox.Add(self.calculateButton) 
     finalHBox.Add(self.quitButton) 

     vbox.Add(finalHBox) 
     self.panel.SetSizer(vbox) 
     self.Show() 


    def Quit(self, event): 
     self.Destroy() 

    def getFiles(self, event): 
     self.iCalFiles = ['Example1','Example1','Example1','Example1','Example1','Example1'] 
     self.layoutElements() 
     self.Update() 



app = wx.App() 
MainFrame() 
app.MainLoop() 
del app 

Répondre

1

1) Je pense que le Sizer vous permettra d'insérer des éléments dans l'ordre existant. Ce serait probablement un peu plus rapide.

2) Je ne vois pas le comportement que vous décrivez sur OSX, mais devinez, appelez self.Layout() avant self.Show() dans layoutElements?

+0

Ajout d'éléments à la Sizer a fonctionné! .Insert() Merci! –

0

J'ai eu un problème similaire où le panneau serait écrasé dans le coin supérieur droit. Je l'ai résolu en appelant le panel.Fit().

Dans votre exemple, vous devez appeler self.panel.Fit() après self.panel.SetSizer(vbox)