wxPython - ошибка перерисовки при замене панели wxFrame - PullRequest
0 голосов
/ 18 февраля 2009

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

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

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

Ответы [ 2 ]

1 голос
/ 18 февраля 2009

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

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

0 голосов
/ 06 мая 2009

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

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

...