2009-02-18 3 views
0

Я создаю небольшую утилиту wxPython в первый раз, и я застрял в проблеме.wxPython - Ошибка перерисовки при замене панели wxFrame

Я хотел бы добавить компоненты к уже созданному фрейму. Для этого я уничтожаю старую панель фрейма и создаю новую панель со всеми новыми компонентами.

1: Есть ли лучший способ динамического добавления контента в панель?

2: Почему в следующем примере возникает странная ошибка перерисовывания, в которой на панели отображается только верхний левый угол, а при изменении размеров панель рисуется правильно? (WinXP, Python 2.5, последний wxPython)

Благодарим за помощь!

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 

ответ

1

1) Я верю, что Sizer позволит вам вставлять элементы в существующее их упорядочение. Скорее всего, это будет немного быстрее.

2) Я не вижу поведения, которое вы описываете на OSX, но, предположив, попробуйте вызвать self.Layout() перед self.Show() в layoutElements?

+0

Добавление элементов в Sizer работал! . Insert() Спасибо! – 2009-02-18 18:13:39

0

У меня была аналогичная проблема, когда панель была зажата в верхнем правом углу. Я решил это, позвонив по телефону panel.Fit().

В вашем примере, вы должны вызвать self.panel.Fit() после self.panel.SetSizer(vbox)

Смежные вопросы