2009-05-19 9 views
0

私は非常に単純なクライアント/サーバアプリケーションを、Pythonでネットワーク/ GUIプログラミングを学ぶための言い訳として書いています。現時点では、ログイン・フレームからアプリケーションのメイン・フレームへの移行に悩まされています。wxPythonのクローズとオープニングフレーム

ログインフレームはwx.Frameのサブクラスであり、基本的に私はそれを閉じて、それがサーバーからの確認を受信したときにメインフレームをオープンしたい:

def handleServerSignon(self, msg): 
    if msg.getCode() == net.message.HANDLE_IN_USE: 
     self.status.SetStatusText('Handle already in use') 
    elif msg.getCode() == net.message.SIGNON_SUCCESSFUL: 
     self.Close() 
     mainWindow = wx.Frame(None, wx.ID_ANY, 'main window', wx.DefaultPosition, \ 
           (640, 480)) 

     mainWindow.Show(True) 

私もこれを取得することはできませんしかし、一貫したエラーメッセージを与えるために...時にはそれが時にはそれは次のようにクラッシュし、動作します:

のpython:../../src/xcb_io.c:242: process_responses:アサーション `(( (long) (dpy-> last_request_read) - (long) ( dpy-> request))< = 0) 'が失敗しました。

ご協力いただきありがとうございます。

ウォーカー

+0

しばらくしてwxpythonを実行していないのですが、ログインウィンドウを閉じる前にメインウィンドウを作成して表示するとどうなりますか? – Ravi

+0

同じこと、毎回動作し、3/4程度の時間がクラッシュします。 –

+0

このネットワークコードは別のスレッドまたはGUIスレッド上で実行されますか?メインのGUIスレッドでのみwx呼び出しを行うことができます。 – FogleBird

答えて

1

私はあなたのメインフレームになるだろう代わりにトップの上にモーダルログインダイアログを表示し、その後、表示されます。

そうしたくない場合は、2つの別々のフレームを作成して、アプリケーションがログイン・フレームでクローズ・イベントをlistenするようにすることをお勧めします。そのイベントハンドラのログインを処理し、メインウィンドウを表示させます。基本的には、イベントハンドラでメインウィンドウをインスタンス化したくない場合は、スコープを失ってからガベージコレクタがフレームを削除しようとするためです。

最後に、getCode()を呼び出して、比較の結果をキャッシュすることを検討する必要があります。あなたのifステートメント elifステートメントは両方ともgetCode()と呼ばれるので、異なる結果が得られる可能性があります。

+0

ありがとう、確かにはるかにクリーンなソリューションです。感謝します! –

0

mainWindowは、handleServerSignonのローカル変数です。これは推測ですが、handleServerSignonメソッドが返されるとすぐにガベージコレクションが行われる可能性があります。

関連する問題