2014-09-24 3 views
0

저는 PyGTK로 간단한 응용 프로그램을 개발하고 있습니다. 우분투에서 클릭했을 때 하위 프로세스를 실행하는 버튼이 있습니다. 단추를 클릭 한 후 상태 막대를 한 번만 변경하고 하위 프로세스가 완료되면 상태 막대를 한 번 변경하려고합니다. 그러나 지금은 하위 프로세스가 완료 될 때까지 기다렸다가 상태 표시 줄을 "완료"로 변경하기 때문에 제대로 작동하지 않습니다. 내 코드는 지금이 같은 것입니다 : (! 그것은 어리석은 소리) 나는 다른 함수에 상태 표시 줄을 변경 한 다음 나머지를 할 수있는 함수를 호출하지만 작동하지 않았다 할 생각동일한 함수에서 서브 프로세스 호출 전에 python 명령을 실행 하시겠습니까?

def on_button_clicked(self, widget): 
     self.statusBar.push(1, "Doing the subprocess...") 

     command = '...' 

     print subprocess.call(command,shell=True) 
      ...  
     self.statusBar.push(1, "Done!") 

. 백그라운드에서 명령이 실행되는 동안 "프로세스 수행 중 ..."상태를 표시하도록 코드를 어떻게 변경해야합니까?

+1

[이] (http://stackoverflow.com/questions/8583975/stop-pygtk-gui-from-locking-up-during-long-running-process) SO post에서 살펴볼 수 있습니다. 하위 프로세스가 기본 UI 스레드 외부에서 실행되도록하는 방법의 예입니다. – TML

답변

2

생각한대로 명령이 완료 될 때까지 subprocess.call()이 (가) 차단됩니다. 원하는 작업은 다른 스레드에서 서브 프로세스 호출을 실행 한 다음 호출이 완료되면 스레드에서 상태 표시 줄을 업데이트하는 것입니다.

def _do_subproc(command, bar): 
    subprocess.call(command, shell=True) 
    glib.idle_add(bar.push, 1, "Done!") # call bar.push in the main GUI thread 

def on_button_clicked(self, widget): 
    self.statusBar.push(1, "Doing the subprocess...") 
    command = '...' 
    threading.Thread(target=lambda: _do_subproc(command, self.statusBar)).start() 

사용자가 스팸 클릭을하지 못하도록 버튼을 회색으로 표시하는 것이 좋습니다.