5

私は python+tkinter で書かれた GUI アプリケーションを持っています。私のワークフローでは、通常、コマンドラインから GUI を起動し、GUI でいくつかのことを行った後、他のターミナル ウィンドウに移動して作業を行っています。必然的に、ある時点で GUI をシャットダウンしたくなります。そして、習慣から、GUI を開始したターミナルに移動して、KeyboardInterrupt (Ctrl-c) を送信することがよくあります。ただし、この割り込みは、ウィンドウ マネージャーで GUI ウィンドウを表示するまで受信されません。なぜこれが起こるのか誰か知っていますか?GUIが単一の機能で開始された場合、簡単な回避策はありmultiprocessingますか?

4

1 に答える 1

5

ニュースグループから:

RedhatLinux5.0でPython1.5を使用しています。tkinterを使用するときにSIGINT(またはCtrl-C)をトラップする最良の方法を見つけようとしています。私が抱えている問題を説明するために、次のようにします...

--tkinterを有効にしてPython-1.5をビルドします。

--Python-1.5ビルドツリーの下のDemo/tkinter/guidoディレクトリに移動します。

--「pythonimageview.pyimage-file」と入力します。ここで、「image-file」は表示可能な画像のフルパス名です。

--画像が表示されたら、「python...」コマンドが呼び出されたばかりのxtermウィンドウがウィンドウフォーカスを保持していることを確認します。

--Ctrl-Cを押します。

この時点では、何も起こりません。Ctrl-Cは無視されているようです。でも今 ...

-キーボードのキーをこれ以上押さずに、ウィンドウフォーカスを表示された画像ウィンドウに設定します。

そのウィンドウにフォーカスが移るとすぐに、Ctrl-Cが有効になります。

私の質問はこれです:最初にウィンドウフォーカスを表示された画像に設定することなく、SIGINT(Ctrl-C)にすぐに応答するように「imageview.py」プログラムを再構築する方法はありますか?

皆さんが私に与えることができるどんな助けにも前もって感謝します。


表示されているのは、シグナルハンドラーの処理方法が原因です。あなたはTcl/Tkメインループで立ち往生しており、シグナルハンドラーはPythonインタープリターによってのみ処理されます。簡単な回避策は、after()を使用して、ダミー関数が1秒に1回程度呼び出されるようにスケジュールすることです。これにより、シグナルがタイムリーに処理されているように見えます。

-グイド・ヴァンロッサム

于 2012-04-08T22:20:50.120 に答える