2009-05-17 7 views
0

口頭での説明は残念です。サブパッケージをインポートするときにwxPythonがアプリケーションを2回起動する

私は、garlicsimwxというパッケージに入っているapplicationwindow.pyというファイルにwxPythonアプリケーションを持っています。上記のファイルを起動してアプリを起動すると、すべてうまく動作します。しかし、ファイルrundemo.pyを、アプリケーションを実行するgarlicsimwxパッケージを含むフォルダに作成しました。しかし、rundemo.pyを使用すると、メインwx.Frameがサブパッケージgarlicsimwx、つまりsimulations.lifeをインポートしたときに何らかの理由でアプリケーションの新しいインスタンスが作成されます(つまり、新しい同一のウィンドウがポップアウトされます)。

私はコマンドを1つずつ実行しようとしましたが、サブパッケージをインポートした後でしかバグが起きませんでしたが、importステートメントは直接それを引き起こしません。制御がPyApp.MainLoopに戻るときだけ、2番目のウィンドウが開きます。

どうすればいいですか?

答えて

4

は、私はあなたがこのようになりますあなたのモジュールの1つにコードを持っていると思う:

import wx 

class MyFrame(wx.Frame): 
    def __init__(...): 
     ... 

frame = MyFrame(...) 

このモジュールが最初にインポートされたときにフレームが作成されます。それを防ぐために、一般的なPythonのイディオムを使用します。

import wx 

class MyFrame(wx.Frame): 
    def __init__(...): 
     ... 

if __name__ == '__main__': 
    frame = MyFrame(...) 

を私は正しく推測しましたか?

+0

公正な推測フランク、しかし、私は 'if __name __ == '__ main __''ビットを持っています。これは私の 'main()'関数を呼び出します。実際、この2つの行をコメントアウトして、 'rundemo.py'から' main() 'を呼び出しても、このバグが起こります。 –

+0

@ cool-RR:if __name__ == "__main__"があるかもしれませんが、インポート時に何らかの関数呼び出しもあります。あなたはあなたのスクリプトを通過し、それが完全にdefとclassのものであることを保証しなければなりません。 –

+0

@フランク:申し訳ありませんが、初めてPythonがモジュールを実行するのは初めてですか? – Joril

0

g_window_was_drawnのようなグローバルブール変数を作成して、ウィンドウを作成する機能をチェックすることができます。値はプログラムの開始時にはfalseになり、最初にウィンドウを作成するときはTrueに変わります。ウィンドウを作成する関数は、g_window_was_drawnがすでに真であるかどうかをチェックし、そうであれば例外をスローします。次に、この機能を実行する担当者を教えてくれる素敵なスタックトレースがあります。

私はそれがあなたを見つけるのに役立つことを願っています。私は口頭で解決ごめんなさい;)

+0

助けてくれなかった - それは別のプロセスだった。 –

+0

しかし、stacktraceの欠如はあなたに答えを与えましたか?両方の時間にg_window_was_drawnが実行されたので、それは別のプロセスでした –

+0

実際にはい、それは私をその答えに導いてくれました。ほんとありがと。 –

0

がそれを手に入れた:私のrundemoファイルには

if __name__=='__main__': 

はありませんでした。実際にはmultiprocessing号でした。新しいウィンドウが別のプロセスで開かれました。

関連する問題