0

IronPython シェルから winform を開始しています。私のフォームは、数時間実行され、出力をシェルに書き込むスクリプトを呼び出しています。

スクリプトの実行中は、GUI がブロックされます (ボタンを押したり、最小化したりすることはできません)。

私はこれらのアプローチを試しました:

  1. ShowDialog() でフォームを開くと、フォームが前面に表示されたままになります。Pythonシェルを前に置いて、書かれたコメントをスクロールできません。最初にフォームを閉じる必要がありますが、これは私が望んでいるものではありません。
  2. Show() でフォームを開くと、python シェルを前面に配置してスクロールできますが、(winform を閉じる前に) python シェルを閉じると、winform は開いたままになり、ブロックされます。タスクマネージャーを使用してのみ強制終了できます。

したがって、ケース 2 のような状況が必要ですが、Python シェルを閉じると、winform も自動的に閉じられるはずです。

ここで他の質問を読んだ後、Show() でフォームを開始することを考えましたが、Modal プロパティを true に設定しましたが、シェルからこれを実行しようとすると、プロパティがプライベートであると表示されます。Visual Studio でフォームを作成したので、モーダル プロパティをどこかに設定することは可能でしょうか?

4

1 に答える 1

1

次を呼び出すことで、アプリケーションのWindowsイベントを処理するためにUIを取得するために必要なものだと思います。

Application.DoEvents()

モーダルウィンドウが機能している理由は、モーダルウィンドウが自動的に舞台裏でループし、ウィンドウメッセージを自動的に処理するためです。

これは、Windowsフォームを表示する長時間実行スクリプトをシミュレートするためのサンプルC#およびIronPythonコードです。

var py = Python.CreateEngine();
var script = @"
import clr
clr.AddReference('System.Windows.Forms')
from System.Windows.Forms import *
from System.Threading import *
frm = Form()
frm.Show()
while True:
    Thread.Sleep(100)
    Application.DoEvents()
";
var source = py.CreateScriptSourceFromString(script);
var scope = py.CreateScope();
source.Execute(scope);

Pythonコードが無期限にループしていることに注意してください(長時間実行されているスクリプトをシミュレートします)。スクリプトがDoEventsを呼び出してUIを更新できるようにする機会があることが重要です。これが当てはまらず、スクリプトが1回の呼び出しで長時間ブロックされる場合は、スクリプト自体を別のスレッドで実行することを検討してください。これにより、メインスレッドをメッセージの処理に使用できるようになります。

スレッドを作成するときは、Winformsが個別のスレッドから作成または更新されないように注意してください。そのため、UI更新メソッドをメインスレッドに同期して呼び出すようにしてください。

上記のサンプルコードでは、コンソールウィンドウを閉じると、Winformもウィンドウによって自動的に破棄されます。だから私はあなたが説明する問題を見ていません。

于 2012-05-08T05:38:39.377 に答える