2014-03-13 18 views
1

如圖所示啓動使用subprocess.Popen()的過程後,我想創建一個帶有「Abort」按鈕的繁忙窗口(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()中更改流程,該流程會在內部進行等待,直到流程完成時纔會返回到一系列「如果不是Process.poll():kill進程」 。在對話框中,最好的方法是設置一個計時器,並捕捉計時器事件。每次只檢查一次該過程。如果它不再運行,用成功的返回碼調用EndModal()。否則,只需返回。類似的東西。 –

+0

我可能會從對話框子類中調用子進程。子流程以這種方式結束,您可以從內部關閉對話框。 –