2012-04-18 1 views
0

IronPython 셸에서 winform을 시작합니다. 내 양식은 다음 몇 시간 동안 실행하고 쉘에 출력을 쓰는 스크립트를 호출합니다.셸 또는 폼을 차단하지 않고 IronPython 셸에서 winform 열기

스크립트가 실행되는 동안 GUI (나는 어떤 버튼을 누르거나 최소화 할 수 없음) 차단됩니다. 내가 ShowDialog를()와 양식을 열 때

  1. 이 양식은 앞에 유지 :

    나는이 방법을 시도했다. 파이썬 셸을 앞에두고 쓰여진 설명을 스크롤 할 수 없습니다. 먼저 양식을 닫아야하지만 이것은 내가 원하는 것이 아닙니다. 내가보기()와 양식을 열 때
  2. , 나는 앞에 파이썬 쉘을 넣을 수 있습니다 나는 그것을 스크롤 할 수 있습니다,하지만 난합니다 (의 WinForm을 닫기 전에) 파이썬 쉘을 닫을 때의 WinForm은 열려 지금 차단이다; 나는 단지 작업 관리자를 사용하여 그것을 죽일 수있다.

그래서 내가 원하는 것은 상황 2와 비슷하지만 파이썬 셸을 닫으면 winform도 자동으로 닫혀 야합니다.

는 여기에 몇 가지 다른 질문을 읽고 나면 내가보기에 양식을 시작()하지만 true로 모달 속성을 설정하는 방법에 대한 생각,하지만 난 셸에서이 작업을 수행 할 때이 속성이 개인 말합니다. Visual Studio에서 양식을 만들었으므로 어딘가에 Modal 속성을 설정할 수 있습니까?

답변

0

난 당신이 호출하여 응용 프로그램의 윈도우 이벤트를 처리하도록 UI를 얻을 필요가 어떻게 생각 : 모달 창은 당신을 위해 일하는 이유

Application.DoEvents() 

이유는 그것 때문에 자동으로 장면 루프 뒤에 Windows 메시지를 자동으로 처리합니다. 여기

은 샘플 C# 및 IronPython의 코드가하는 파이썬 코드는 단지 indefinately (당신의 장기 실행 스크립트를 시뮬레이션) 루핑

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); 

공지 것이 중요하다 윈도우 폼을 보여주는 오래 실행되는 스크립트를 시뮬레이션하는 것입니다 스크립트는 DoEvents를 호출하여 UI를 업데이트 할 수있는 기회를 갖습니다. 이것이 사실이 아니고 스크립트가 단일 호출에서 오랫동안 차단되는 경우 별도의 스레드에서 스크립트 자체를 실행하는 것을 고려할 수 있습니다. 이렇게하면 주 스레드를 그대로두고 메시지를 처리 ​​할 수 ​​있습니다.

는 그냥 윈폼 만들거나 별도의 스레드에서 업데이트 할 좋아하지 않는 스레드를 생성 할 때 조심, 그래서 당신은 메인 스레드에 동기화하여 UI 업데이트 방법을 호출해야합니다. 내가 콘솔 창을 닫을 때 위의 샘플 코드와

는의의 WinForm도 자동으로 창문에 의해 파괴된다. 그래서 당신이 묘사하는 문제를 보지 않고 있습니다.

관련 문제