Arch で wxPython 2.8 (問題なく動作しますが、そうすべきではないと思います...) と Mac OS X で wxPython 2.9 を使用します。どちらも Python 2.7 です。私のコードは、現在の状態に応じて異なる画面を切り替えることで構成されています。状態 (画面) が切り替わるたびに、メインのサイザーをクリアし、メイン フレームで DestroyChildren() を呼び出してから、それらに他のコンポーネントを追加します。
したがって、基本的には、メインスレッドで 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)
更新により、フレームがクリアされ、状態がチェックされ、ビルダー メソッドが呼び出されます
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 を使用してみました。その結果、イベントの最後にすべてのコンポーネントが削除されました。新しく構築されたコンポーネントも含まれます。