2014-03-13 1 views
1

그림과 같이 subprocess.Popen()을 사용하여 프로세스를 시작한 후 "취소"버튼이있는 사용 중 창 (wx.Dialog)을 만들고 싶습니다. 이는 의도 한대로 작동합니다. 그러나 프로세스가 완료되는 데 필요한 시간이 주어지면, 사용 중 창이 파손되어야합니다. 아래에 표시된 코드에서이 문제가 발생하지 않습니까?wxpython에서 wx.Dialog를 제거 할 수 없습니다.

import subprocess 
import wx 

ProcessToCall = [Some, process, with, some, arguments] 

Process = subprocess.Popen(ProcessToCall) 
BusyDialog = wx.Dialog(...) 

if BusyDialog.ShowModal() == wx.ID_CANCEL: 
    Process.kill() 

Process.wait() 
BusyDialog.Destroy() 

내가 EndModal 및 wx.Dialog의 다양한 방법을 실험하고 다양한 온라인 자습서 상담,하지만 아무것도 원하는 효과를 얻을 것 같다, 나는 모든 아이디어 나갈거야 왔습니다.

저는 Ubuntu 13.10에서 Python 2.7 및 wxPython 2.8을 사용하고 있습니다.

+1

당신의 서브 프로세스가 종료되지 않은 것처럼 들리 네 ... Process.wait() 명령이 돌아오고 있습니까? –

+1

당신은 다소 정확합니다 - 아래 지적한 바와 같이 ShowModal은 실제로 문제이며 프로그램은 사용자 입력을 기다리는 중 "멈 춥니 다"... – Hmmmmm

+0

오, 거친 것 ... 나는 내가 생각한 것을 모른다 ... –

답변

1

나는 문제가 실제로 ShowModal인데, 사용자가 창을 닫을 때까지 뭔가를 클릭 할 때까지 종료되지 않는다고 생각합니다. 문서에서 :

모달 대화 상자를 표시합니다. 대화 상자 이 wxDialog :: EndModal로 해제 될 때까지 프로그램 흐름이 반환되지 않습니다.

나는 ShowModal 잘하고 적절한 생각하지만 그 자체를 닫을 수 있도록 대화에 과정을 통과해야하고 대화 아마 프로세스가 (아마도 EVT_TIMER)를 완료하기위한 정기적 인 검사의 일종이 필요합니다 프로세스가 완료되면 리턴하십시오. 사용자가 취소하면 여전히 중단 코드가 반환되므로 여전히 그 코드를 잡아 당겨 프로세스를 종료해야합니다.

+0

ave no 당신은 정확합니다 - 고마워요! 아직도 어떻게 작동하는 솔루션을 구현하는 지 잘 모르지만, 디버깅에 감사드립니다 :). 프로세스를 창으로 전달하는 방법을 실험 해 보겠습니다. – Hmmmmm

+0

내부적으로 대기하고 프로세스가 완료 될 때까지 리턴하지 않는'Process.wait()'에서'if not Process.poll() : kill process'로 당신의 흐름을 변경해야합니다 . 대화 상자에서 가장 좋은 방법은 타이머를 설정하고 타이머 이벤트를 잡는 것입니다. 매번 프로세스를 한 번 확인하십시오. 더 이상 실행되지 않으면 성공 리턴 코드와 함께'EndModal()'을 호출하십시오. 그렇지 않으면 그냥 돌아갑니다. 그런 것. –

+0

아마도 하위 대화 상자 내에서 하위 프로세스를 호출 할 것입니다. 하위 프로세스가 종료되는 방식으로, 내부에서 대화 상자를 닫을 수 있습니다. –