2011-07-15 107 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