wxPython - обновление / обновление части графического интерфейса - PullRequest
0 голосов
/ 15 июля 2011

Я использую GridBagSizer с несколькими ячейками, содержащими StaticTextCtrl.Некоторые из этих текстов должны быть изменены в зависимости от поведения пользователя.Поэтому мне нужно обновить графический интерфейс при внесении изменений.GridBagSizer определяется в функции, которая вызывается функцией в другом классе, который, в свою очередь, вызывается во время сборки GUI.Чтобы проиллюстрировать это, вот фрагмент кода:

class SampleClass(wx.MiniFrame):

    [...some other code...]

    def makeGUI(self):
        # make panels
        panelFoo = self.makePanelFoo()
        panelBar = self.makePanelBar()
        panelFinal = self.makePanelFinal()

        # pack elements
        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
        self.mainSizer.Add(panelFoo, 1, wx.EXPAND, 0)
        self.mainSizer.Add(panelBar, 1, wx.EXPAND, 0)
        self.mainSizer.Add(panelFinal, 1, wx.EXPAND, 0)

        # fit layout
        self.mainSizer.Fit(self)
        self.SetSizer(self.mainSizer)
    # ----


    [...some other code...]

    def makePanelFinal(self):

        panel = Canvas(self, -1)

        # define canvas parts     
        self.partA = panel.makePartA()        
        self.partB = panel.makePartB()
        self.partC = panel.makePartC()

        # arrange canvas parts
        mainSizer = wx.BoxSizer(wx.VERTICAL)
        mainSizer.Add(self.partA, 1, wx.EXPAND|wx.ALIGN_CENTER|wx.LEFT|wx.RIGHT, mwx.PANEL_SPACE_MAIN)
        mainSizer.Add(self.partB, 0, wx.EXPAND|wx.ALIGN_CENTER|wx.LEFT|wx.RIGHT, mwx.PANEL_SPACE_MAIN)
        mainSizer.Add(self.partC, 0, wx.EXPAND|wx.ALIGN_CENTER|wx.LEFT|wx.RIGHT|wx.BOTTOM, mwx.PANEL_SPACE_MAIN)        

        # fit layout
        mainSizer.Fit(panel)
        panel.SetSizer(mainSizer)

        return panel
    # ----


class Canvas(panel):

    [...some other code...]

    def makePartC(self):

        sizer = wx.StaticBoxSizer(wx.StaticBox(self, -1, ""), wx.VERTICAL)
        grid = wx.GridBagSizer(mwx.GRIDBAG_VSPACE, mwx.GRIDBAG_HSPACE)

        [...some code where the GridBagSizer is made...]

        sizer.Add(grid, 1, wx.EXPAND|wx.ALIGN_CENTER|wx.ALL, 5)

        return sizer

Теперь мне нужно определить функцию в классе Canvas (или она должна быть помещена в класс SampleClass?), Которая будет вызываться принеобходимо изменить графический интерфейс:

    def updateCanvas(self):
        ??? .Refresh() ???   
    # ----

Может кто-нибудь подсказать, какие команды мне следует использовать?

Спасибо, Woodpicker

Ответы [ 2 ]

0 голосов
/ 15 июля 2011

Все, что вам нужно сделать, это вызвать метод SetLabel StaticText, чтобы обновить его.Обычно я не рекомендую делать весь метод parent.widget.SetLabel (), поскольку это может стать довольно уродливым довольно быстро.Это работает, но я предпочитаю использовать pubsub самостоятельно.Вы можете прочитать об этом здесь: http://www.blog.pythonlibrary.org/2010/06/27/wxpython-and-pubsub-a-simple-tutorial/

РЕДАКТИРОВАТЬ: Например, вы можете настроить приемник следующим образом:

Publisher().subscribe(self.updateDisplay, ("update.display"))

Затем в функции, вы будете делатькак это:

def updateDisplay(self, msg):
    self.myStaticTxtCtrl.SetLabel(msg.data)
0 голосов
/ 15 июля 2011

Вам необходимо сохранить ссылку на wxStaticText в вашем GridBagSizer, а затем обновить элемент управления с новым текстом.

Вот пример с FlexGridSizer:

self.fNameC = wx.StaticText(self, -1, fn)
fgs = wx.FlexGridSizer(5, 2, 5, 5)
fgs.Add(self.fNameC, 0, wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL)

позже я делаю это:

self.panel.fNameC.SetLabel(fName)
...