単純なテキスト ウィンドウを作成する場合は、それを行うための GUI フレームワークを選択する必要があります。これほど単純なものについては、 (PythonにTkinter付属している) またはPyObjC(Apple の Python 2.7 にプリインストールされている)を使用しない理由はありません。wxgobjectQt
いずれにせよ、どのように実行するにせよ、メッセージを受け取り、それをテキスト ウィンドウに追加する関数を作成し (必要に応じて遅延して作成することもできます)、その関数を通常の場所で呼び出す必要がありますprint。logging同じことを行うハンドラーを作成してインストールすることもできますlog.info。(代わりに、これを実行してリダイレクトおよび/またはを行うファイルのようなオブジェクトを作成することもできますが、ing コードを制御できない場合を除き、それはより多くの作業になります。)stdoutstderrprint
ここでの唯一の問題は、GUI にはイベント ループが必要であり、おそらくコードをシーケンシャル スクリプトとして記述したことです。
これを回避する 1 つの方法は、現在のスクリプト全体をバックグラウンド スレッドにすることです。バックグラウンド スレッドからウィジェットにアクセスできる GUI ライブラリを使用している場合は、すべてが簡単です。あなたprintfuncだけtextwidget.append(msg)です。そうでない場合は、少なくともcall_on_main_thread型関数がある可能性があるため、あなたprintfuncはそうしますcall_on_main_thread(textwidget.append, msg)。最悪の事態が発生した場合 (Tkinter ではそうなると思います)、メッセージをプッシュするための明示的なキューを作成し、イベント ループにキュー ハンドラーを記述する必要があります。このレシピはあなたにアイデアを与えるはずです。workerThreadの本体をコードに置き換え、で終了しself.endApplication()ます。(おそらくもっと良い例があります。これは、クイック検索で最初に見つけたものです。)
その逆の方法は、コードをイベント ループと協調的に動作させることです。のような一部のライブラリには、処理の各チャンクの後に呼び出すだけでwx機能するような関数があります。SafeYield他の人はそれを持っていませんが、コードからイベントループを明示的に駆動する方法を持っています. 他のものにはどちらもありませんが、すべてのイベント ループ フレームワークには、新しいイベントをスケジュールする方法が必要です。そのため、コードを一連の関数に分割して、それぞれがすばやく終了し、root.after_idle(nextfunc).
しかし…本当にこれを行う必要がありますか?
まず、 で作成されたものを含むすべてのアプリは、 でpy2app実行すると、標準出力を端末に送信しますFoo.app/Contents/MacOS/Foo。また、必要に応じて、そのように機能するように設定することもできopen Foo.appます。明らかに、これは Finder でアプリをダブルクリックするだけの人には役に立ちません (ターミナルがないため)。
Foo.commandさらに、次のようなことを行うファイルを作成します$(dirname $0)/Foo.app/Contents/MacOS/Foo。そのファイルをダブルクリックすると、Terminal.app が起動し、スクリプトが実行されます。
または、さらに単純にすることもできます。logging出力を syslog に使用するだけで、各ファイルがいつ完了したかを確認したい場合は、ログ メッセージがConsole.app.
py2app最後に、そもそも必要ですか?外部依存関係がない場合は、スクリプトの名前を に変更するだけFoo.commandで、ダブルクリックすると Terminal.app で実行されます。外部依存関係がある場合でも.command、.app.
明らかに、これらのアイデアのどれも、インターフェイスを構築するためのプロフェッショナルまたは初心者に優しい方法ではないため、それが重要な場合は、GUI を作成する必要があります。