2011-07-15 98 views
0

我使用GridBagSizer和几个包含StaticTextCtrl的单元格。其中一些文本需要根据用户行为进行更改。所以我需要在更改时更新GUI。 GridBagSizer被定义在一个函数中,该函数被另一个类中的函数调用,该函数在GUI汇编期间又被调用。为了说明这一点,下面的代码片段:wxPython - 刷新/更新部分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类?)将被调用时,在GUI的变化需要:

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

有人请给我一个提示,我应该使用哪个命令?

感谢,Woodpicker

回答

0

所有你需要做的是调用静态文本的SetLabel方法来更新它。我通常不推荐完成整个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

感谢pubsub上有趣的网页。在这个例子中,调用self.showFrame。对我而言,这需要什么功能?我可以以某种方式将StaticTextCtrl绑定到Publisher()。subscribe()? – Woodpicker

+0

你可以随意调用函数,比如updateStaticText(self,fName)。然后,只需从pubsub处理程序传递所需的数据即可。 –

+0

是的,我当然可以调用我喜欢的函数 - 但是接下来我的问题出现了:该函数应该做什么?在我的情况下,这个函数的第一步是重新定义我的'StsticTextCtrl'。接着?如何在GUI中显示此更改(BoxSizer中BoxSizer中的StaticBoxSizer中的GridBagSizer中的StaticTextCtrl)。我可以在这里给我什么命令?谢谢! – Woodpicker

0

您需要在您的GridBagSizer保存到wxStaticText的引用,然后更新为新的文本控制。

这是一个带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) 
+0

谢谢,但我仍然感到困惑。 SetLabel也会改变你的GUI吗?看起来好像我仍然做错了一切 - 我对StaticText所做的所有更改都会导致字段中的更改(我可以通过打印值来测试该更改),但这些更改未反映在GUI中?你在哪里打电话给SetLabel?在相同的功能,在另一个功能?我在类中嵌套会导致问题吗? – Woodpicker