これには非常によく似た質問がたくさんありますが、私がやろうとしていることに特に当てはまる質問は見つかりません。
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 の応答性が維持され、すべてのテキストがインポートされたモジュールからのみ取得されることだけです。
(また、停止ボタンに関する二次的な質問 - シミュレーション スレッドを単に強制終了するのは悪い形式ですか?)
ありがとう、
ダンカン