2012-04-18 13 views
0

我開始從IronPython的殼一個winform。然後我的表單調用一個運行幾個小時的腳本,並將輸出寫入shell。開口從一個殼的IronPython一個winform而不阻塞殼或形式

當腳本運行時,GUI被阻斷(I不能打任何按鈕或將其最小化)。

我嘗試這些方法:

  1. 當我打開與ShowDialog的()形式,形式停留在前面。我不能把Python shell放在前面,並滾動書面評論。我必須先關閉窗體,但這不是我想要的。
  2. 當我打開與展()的形式,我可以把蟒蛇殼在前面,我可以滾動,但是當我關閉蟒蛇殼(關閉的winform之前),在WinForm保持打開狀態,現在堵塞;我只能用任務管理器殺死它。

所以,我想要的情況就像情況2,但是當我關閉我的python shell時,winform也應該自動關閉。

這裏讀了一些其他問題後,我想到了開頭顯示的形式(),但Modal屬性設置爲true,但是當我嘗試從外殼做到這一點說,財產是私有的。我在Visual Studio中創建了窗體,因此可能在某處設置Modal屬性?

回答

0

我認爲你需要通過調用讓你的UI來處理應用程序的窗口的事件是什麼:

Application.DoEvents() 

爲什麼模態窗口是爲你工作的原因是因爲它會自動在幕後循環和自動處理Windows消息。

這裏是一個示例C#和IronPython代碼模擬出Windows窗體長時間運行的腳本

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。如果情況並非如此,並且您的腳本會在單次調用中阻塞很長時間,那麼您可以考慮在單獨的線程中運行腳本本身,這將允許您離開主線程來處理消息。

創建線程的WinForms不喜歡被創建或從一個單獨的線程更新時,只是要小心,所以一定要由他們同步到主線程中調用你的UI更新方法。

隨着上述樣本代碼,當我關閉控制檯窗口,在WinForm也自動通過窗口銷燬。所以我沒有看到你描述的問題。