0

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 を使用してみました。その結果、イベントの最後にすべてのコンポーネントが削除されました。新しく構築されたコンポーネントも含まれます。

4

1 に答える 1

1

実際に threading モジュールまたはスレッドに関連するものを使用していますか? wxPython でウィジェットを削除するためにそれらを必要としないはずです。最初にすべてのウィジェットを破棄する理由がわかりません。メイン フレームを非表示にして、すべての新しいウィジェットを含む子フレームを表示しないのはなぜですか? または、2 つのパネルを使用します。1 つのパネルが破棄され、他のウィジェットを含む別のパネルがその場所に置かれますか? 私のブログに後者の例があります。

于 2012-08-07T15:59:29.907 に答える