2011-07-15 35 views
0

私はStaticTextCtrlを含むいくつかのセルを持つGridBagSizerを使用します。これらのテキストの一部は、ユーザーの動作に応じて変更する必要があります。ですから、変更が行われたときに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/

EDIT:たとえば、あなたが受信機は、このように設定している可能性があり:

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

あなたGridBagSizerwxStaticTextへの参照を保存し、新しいテキストでコントロールを更新する必要があります。ここで

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

関連する問題