2

これには非常によく似た質問がたくさんありますが、私がやろうとしていることに特に当てはまる質問は見つかりません。

GUI を作成しているシミュレーション (SimPy で作成) があります。シミュレーションの主な出力は、'print' ステートメントからコンソールへのテキストです。今、最も簡単な方法は、別のモジュール GUI.py を作成し、シミュレーション プログラムをそこにインポートすることだと思いました。

import osi_model

すべての print ステートメントを GUI でキャプチャし、Textctrl 内に表示する必要があります。ここには、次の行に沿って数え切れないほどの例があります。

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        <general frame initialisation stuff..>

        redir=RedirectText(self.txtCtrl_1)
        sys.stdout=redir

class RedirectText:
    def __init__(self,aWxTextCtrl):
        self.out=aWxTextCtrl

    def write(self,string):
        self.out.WriteText(string)

また、「Go」ボタンからシミュレーションを開始しています。

def go_btn_click(self, event):
    print 'GO'
    self.RT = threading.Thread(target=osi_model.RunThis())
    self.RT.start()

これはすべて正常に動作し、シミュレーション モジュールからの出力は TextCtrl によってキャプチャされますが、GUI がロックされて応答しなくなります。アクセスできるようにする必要があります (少なくとも [停止] ボタンが必要です)。ここで行った新しいスレッドの作成が失敗した試みであるかどうかはわかりませんが、このプロセスのある段階で新しいスレッドが必要になると思います。

人々は wx.CallAfter の使用を提案していますが、インポートされたモジュールが wx を認識していないことを考えると、どうすればよいかわかりません。また、シミュレーション アーキテクチャ全体を現実的に調べて、すべての print ステートメントを wx に変更することもできません。インポートされたシミュレーション プログラム内からシェルをキャプチャしようとすると、プログラムがクラッシュします。

これをどのように達成するのが最善かについて、誰かアイデアはありますか? したがって、私が本当に必要としているのは、すべてのコンソール テキストが TextCtrl によってキャプチャされ、GUI の応答性が維持され、すべてのテキストがインポートされたモジュールからのみ取得されることだけです。

(また、停止ボタンに関する二次的な質問 - シミュレーション スレッドを単に強制終了するのは悪い形式ですか?)

ありがとう、

ダンカン

4

2 に答える 2

0

長時間実行されるタスクに関するこの WX wiki 記事を調べることをお勧めします。

これは、「開始」ボタンを使用して長時間実行されるプロセスに対処している状況に特に対処します。スレッドやアイドル ハンドラーなどのさまざまな手法を使用したさまざまな例がいくつか示されています。

于 2012-11-16T11:23:10.853 に答える
-1

stdoutをログファイル(または単純なSQLiteデータベース?)にリダイレクトしてから、スレッドを使用してログファイルの更新を確認し、wx.CallAfterなどを使用してGUIに渡す必要があると思います。Pythonで構築されたソケットサーバーのようなものを使用できる場合があります:http ://wiki.wxpython.org/AsynchronousSockets 。wxPythonクックブックにはRPCサーバーの使用についても言及されていると思います(おそらくこれはhttp://docs.python.org/library/simplexmlrpcserver.html)が、詳細は覚えていません。

また、公式のwxPythonメーリングリストで質問してみてください。彼らはあそこにとてもフレンドリーです。

于 2012-04-17T14:48:59.687 に答える