2012-08-07 60 views
0

在Arch上使用wxPython 2.8(工作正常,但我認爲它不應該...)和Mac OS X上的wxPython 2.9,都是Python 2.7。我的代碼由根據當前狀態在不同屏幕之間切換組成。在狀態(屏幕)之間的每個開關上,清除我的主Sizer並在主框架上調用DestroyChildren(),然後使用其他組件填充它們。在一個按鈕上清除wxPython框架點擊

所以基本上我認爲我有外部線程試圖改變主線程中的wx組件。我猜這不是wxPython中的最佳實踐,那麼我將如何修改它?

附加事件按鈕

self.login_button.Bind(wx.EVT_BUTTON, self.login_button_click) 

日誌事件做的東西,並調用(模型狀態改變了這裏)

def login_button_click(self,event): 

    ... 
    # CHANGE THE self.model.current_state 
    ... 

    self.update(None) 

更新清除框架的更新,檢查狀態,調用builder方法

def update(self, o): 
    self.box.Clear() #clear the main sizer 
    self.frame.DestroyChildren() #delete all children, THIS IS WHERE THE CODE SEGFAULTS 


    print "STATE: "+self.model.current_state 

    if self.model.current_state == self.model.... 
     ... 
    elif self.model.current_state == self.model.... 
     ... 

我試過使用wx.CallAfter,導致我在活動結束時,所有組件都會被拆除,即使是新建的組件也是如此。

回答

1

你實際上是在使用線程模塊還是與線程相關的東西?你真的不應該需要那些在wxPython中刪除小部件。我不確定爲什麼你要首先銷燬所有的小部件。爲什麼不隱藏主框架並顯示所有新小部件的子框架?或者使用兩個面板。一個面板被銷燬,另一個面板與其他小部件放置在一起?我在blog上有一個後者的例子。

+0

我發生的一件奇怪的事是frame.Layout()不工作?爲了讓面板正常顯示,我需要調整框架大小。我在頂層框架上調用Layout()方法。 – Sash 2012-08-10 13:44:27

+0

您可能需要在包含面板的sizer上調用Layout()。 – 2012-08-10 17:25:25

+0

厭倦了self.sizer.Layout()和self.Layout()的組合,結果相同。調用.Layout()強制重新佈局()的所有chidl元素btw?或者我應該嘗試在較低層次上調用佈局? – Sash 2012-08-12 18:14:22