我有wx.Frame
。我需要不时更改内容。
我有一个计时器,每隔几秒我检查一次状态,如果状态已经改变,我需要改变帧的内容。
为了做到这一点,我在名为panel.Reparent(None)
的框架中创建了一个面板,并创建了一个包含新内容的面板,但框架未使用新创建的面板进行更新。我尝试使用destroy(panel.Destroy()
),但这不起作用。
更改帧内容的推荐方法是什么(不仅是数据,我需要添加和删除UI组件)?
类TestFrame(wx.Frame): def init (个体经营): wx.Frame。 init (self,None,title =“Double Buffered Drawing”) self.counter = 0 self.panel = wx.Panel(self,-1) wx.CheckBox(self.panel,-1,“Alpha”,(35,40),(150,20))
# Create a timer to update the data values
self.Bind(wx.EVT_TIMER, self.OnTimeout)
self.timer = wx.Timer(self)
self.timer.Start(5000)
def OnTimeout(self, evt):
p = self.panel
self.counter = self.counter + 1
try:
p.Reparent(None)
except e:
print 'B'
if self.counter % 2 == 0:
self.panel = wx.Panel(self, -1)
wx.CheckBox(self.panel, -1, "Alpha", (35, 40), (150, 20))
self.Show() #Tried also self.Layout self.Refresh self.Update
答案 0 :(得分:1)
在运行时添加或删除小部件时,您几乎总是必须在删除或添加小部件后调用Layout()。通常在父sizer上调用Layout会起作用,但有时你必须在frame对象上调用它。您可以看到一个示例here,其中我只隐藏了一个面板并显示了另一个面板。
我还动态地写了另一篇关于实际removing or adding widgets的教程。这对你也有帮助。
编辑(6-26-12):由于OP似乎需要一个例子,我写了一个自我毁灭的小组:
import wx
########################################################################
class PanelOne(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent)
self.countdown = wx.StaticText(self, label="This panel will self-destruct in 10 seconds")
########################################################################
class PanelTwo(wx.Panel):
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
wx.Panel.__init__(self, parent)
txt = wx.StaticText(self, label="Panel Two")
########################################################################
class MainFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="Panel Smacker")
self.panelOne = PanelOne(self)
self.time2die = 10
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.update, self.timer)
self.timer.Start(1000)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.sizer.Add(self.panelOne, 1, wx.EXPAND)
self.SetSizer(self.sizer)
#----------------------------------------------------------------------
def update(self, event):
""""""
if self.time2die < 0:
self.panelOne.Destroy()
self.panelTwo = PanelTwo(self)
self.sizer.Add(self.panelTwo, 1, wx.EXPAND)
self.Layout()
self.timer.Stop()
else:
msg = "This panel will self-destruct in %s seconds" % self.time2die
self.panelOne.countdown.SetLabel(msg)
self.time2die -= 1
if __name__ == "__main__":
app = wx.App(False)
frame = MainFrame()
frame.Show()
app.MainLoop()