我使用GridBagSizer和几个包含StaticTextCtrl的单元格。其中一些文本需要根据用户行为进行更改。因此,我需要在进行更改时更新GUI。 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
中?),当需要对GUI进行更改时将调用该函数:
def updateCanvas(self):
??? .Refresh() ???
# ----
有人可以给我一个提示,我应该使用哪些命令?
谢谢,Woodpicker
答案 0 :(得分:0)
您需要在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)
答案 1 :(得分:0)
您需要做的就是调用StaticText的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)