2012-06-25 38 views
0

我有一個wx.Frame。我需要不時更改內容。 我有一個計時器,每隔幾秒我檢查一下狀態,如果狀態改變了,我需要改變幀的內容。什麼是重繪wxframe內容的推薦方法?

爲了做到這一點,我在框架中創建了一個名爲panel.Reparent(None)的面板,並創建了一個包含新內容的面板,但未使用新創建的面板更新該面板。我嘗試了銷燬(panel.Destroy()),但這沒有奏效。

什麼是推薦的方式來改變幀內容(不僅數據,我需要添加和刪除UI組件)?

類TestFrame(wx.Frame): DEF 初始化(個體): wx.Frame。 (self,-1) wx.CheckBox(self.panel,-1,「Alpha,0,0,0,0) 」(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 

回答

1

加入或在運行時除去小部件時,你幾乎總是有一個窗口小部件的移除或添加之後調用佈局()。通常在父級sizer上調用Layout會做到這一點,但有時您必須在框架對象上調用它。您可以看到一個示例here,我只是隱藏了一個面板並顯示了另一個面板。

我還寫了另一個關於動態實際removing or adding widgets的教程。這也可以幫助你。

EDIT(12年6月26日):由於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() 
+0

非常感謝你的幫助。您的示例非常棒,但我正在尋找一種方法來完成刪除舊面板並使用其他小部件創建新面板的方法。 我的應用程序是一個控制管理應用程序,所以我需要不時地檢查狀態並基於狀態創建面板。 順便說我不知道​​,如果它的相關的我得到這個警告: (python2.7:6210):GLib的-的GObject-WARNING **:鑄造成'GtkPizza」 (python2.7無效unclassed指針:6210):GLib-GObject-WARNING **:從'(null)'無效投射到'GtkObject' – user1236097

+0

第二個教程展示瞭如何刪除小部件。只要摧毀面板,並把一個新的。 –

+0

哇,再次哇。 如果我使用sizer,它會起作用。 – user1236097

相關問題