2009-12-12 3 views
0

현재 디렉토리에 파이썬 파일 목록을 작성하고 각각에 대한 단추를 생성하는 Tk 파이썬 프로그램이 있습니다. 버튼을 클릭하면 해당 파이썬 프로그램이 새로운 그놈 터미널의 하위 프로세스를 통해 시작됩니다. 하위 프로세스가 새 터미널에서 실행을 마친 후에 버튼의 색상을 빨간색으로 전환하고 싶습니다. 불행히도 버튼이 거의 즉시 색상을 변경합니다.서브 프로세스가 완료된 후 색을 지정하십시오.

from Tkinter import * 
import os, subprocess 

root = Tk() 
buttonsD = {} 

def launch(ourfile): 
    p=subprocess.Popen(["gnome-terminal","-e","python " + ourfile], shell=False) 
    buttonsD[ourfile].configure(bg='red') 

dirlist=os.listdir(os.getcwd()) 
for fname in dirlist: 
    if fname.endswith('py') and fname != 'gui2.py': 
     buttonsD[fname] = Button(root,text=fname,command=lambda i=fname: launch(i)) 
     buttonsD[fname].pack(side=TOP,expand=YES,fill=BOTH) 

root.mainloop() 

거의 동시에 I가 p.poll == 없음 동안 기다린가 그놈 터미널 생성되어야하는 순간 걸리는 것을 알 수 있다는 것을 의미한다. 그러나 터미널이 생성되는 즉시 새 터미널에서 프로세스가 실행 중이더라도 버튼이 빨간색으로 변합니다. 나는 새로운 그놈 터미널을 생성 할 수 없으며 실행하고자하는 프로세스를 알릴 수 없다. gnome-terminal은 bash의 새로운 인스턴스를 생성 한 다음 완료된 것으로 반환하므로 표준 입력란과 통신하려고하면 파이프 오류가 발생합니다.

답변

1

그놈 터미널이 부모 프로세스 그룹에서 분리하기 위해 이중 포크를하고 있다고 생각합니다. 실제로 하위 프로세스가 실제로 즉시 종결됩니다. 관찰 한대로 하위 포크에서 모든 것이 발생합니다. 너는에 직접적인 접근이 없다.

불행히도 나는 그놈 터미널이이 이중 포크 동작을 비활성화하는 어떤 방법도 제공하지 않는다고 생각합니다. 따라서 "후손"이 언제 끝났는지 알아 내려면 해당 프로세스를 확인하고 주기적으로 모니터링해야합니다. 직접적으로 상호 작용하는 것은 매우 어려운 명령입니다. 관련이없는 임의의 "임의"프로세스와 상호 작용하는 것보다 쉽지는 않습니다 .-(.

1

gnome-terminal에서 Python 프로그램을 시작하는 데 사용할 명령 줄과 Tkinter 응용 프로그램에서 subprocess을 사용하는 방법에 대한 두 가지 질문이 있습니다. 나는 후자에 대해서만 알고있다.

subprocess.Popen 즉시 반환되므로 버튼이 즉시 빨간색으로 변합니다. 아마 당신은 어떤 프로그램이 실행 중인지에 대한 목록을 만들어야한다고 생각합니다. 그런 다음 각 실행중인 프로세스에 을 호출하는 poll_processes 함수를 작성하고 결과가 None이 아닌 경우 목록에서 제거하고 버튼을 빨간색으로 바꿉니다.

은 그럼 당신은 Tkinter를 위해 준비되어 할 일은 정기적으로 당신이 poll_processes에 첫 번째 통화를 예약 할 수 frame.after(msec, poll_processes)를 호출하고 poll_processes 다음 전화를 예약 할 수있는 같은 일을함으로써 할 수있는 함수를 호출합니다.

관련 문제