2013-02-27 2 views
0

버튼을 클릭하면 다른 파이썬 스크립트가 열리 며 두 번째 스크립트에서 일부 반환 함수가 원래 스크립트로 돌아가는 것이 도움이 될 것이라고 기대하는 파이썬 스크립트를 만들려고합니다. .스크립트를 입력하고 종료하는 스크립트

감사합니다.

첫째, 당신은 정말 모든이 작업을 수행 할 필요가 있는지에 대해 생각 : 귀하의 질문은 매우 모호하기 때문에

+0

닫은 프로그램으로 돌아갈 수 없습니다. 두 번째 스크립트가 완료되면 처음부터 다시 시작한다는 의미입니까? 또는 첫 번째 스크립트는 창을 닫지 만 계속 실행됩니까? – abarnert

+0

또한 어떤 GUI 라이브러리를 사용하려고합니까? – abarnert

답변

3

, 여기에 다소 모호한 대답. 왜 첫 번째 스크립트는 그냥 import 두 번째 스크립트를 모듈로 호출 할 수 없으며 어떤 함수를 호출합니까?

당신이 그것에 대한 좋은 대답을 가지고 있다고 가정 해 보자. 다른 스크립트를 "닫고"실행해야 할 필요가있다. 여기서 "닫기"란 "GUI를 보이지 않게하라"는 의미이다.

def handle_button_click(button): 
    button.parent_window().hide() 
    subprocess.call([sys.executable, '/path/to/other/script.py']) 
    button.parent_window().show() 

이렇게하면 창을 숨기고 다른 스크립트를 실행 한 다음 다른 스크립트가 완료되면 다시 표시합니다. 일반적으로 이벤트 핸들러의 중간에서 천천히 그리고 블로킹을하는 것은 대단히 나쁜 생각입니다. 그러나이 경우에는 어쨌든 우리가 전체 UI를 감추고 있기 때문에 그걸 가지고 도망 갈 수 있습니다.

더 똑똑한 솔루션은 두 번째 스크립트가 보내거나 감시자 스레드가 보내는 신호와 관련됩니다. 예를 들어 :

def run_other_script_with_gui_hidden(window): 
    gui_library.do_on_main_thread(window.hide) 
    subprocess.call([sys.executable, '/path/to/other/script.py']) 
    gui_library.do_on_main_thread(window.show) 

def handle_button_click(button): 
    t = threading.Thread(target=run_other_script_with_gui_hidden) 
    t.daemon = True 
    t.start() 

은 분명히 당신은 당신의 선택 창 라이브러리에 해당하는 코드 button.window(), window.hide(), gui_library.do_on_main_thread 등 같은 것들을 교체해야합니다.

첫 번째 스크립트를 실제로 종료하고 두 번째 스크립트를 다시 실행하려는 경우 수는 수 있지만 까다 롭습니다. 두 번째 스크립트를 하위 프로세스로 실행하지 않고 형제로 시작하려고합니다. 이상적으로는 자신의 프로세스를 대신 사용하기를 원합니다. 당신의 OS가 자동적으로 그렇게하지 않는 한 GUI를 종료해야한다는 것을 제외하고는 (기본적으로 Windows는 유닉스는 그렇지 않을 것입니다). os.exec 패밀리를 살펴보십시오.하지만 유닉스에서 어떻게 작동하는지 이해해야합니다. 두 스크립트가 서로 밀접하게 결합되기를 원하지 않는 한, 명령 행에서 첫 번째 스크립트를 다시 시작하기위한 정확한 올바른 인수를 전달할 수 있습니다 (기본적으로 다른 매개 변수 다음에 전체 sys.argv 전달) .

execfile을 사용하면 기존 인터프리터 인스턴스에서 두 번째 스크립트를 실행 한 다음 두 번째 스크립트 execfile을 다시 사용할 수 있습니다. 이 솔루션은 exec 솔루션과 비슷하지만 동일하지는 않습니다.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 글쎄요, 메인 파이썬 스크립트는 점점 커지는 목록이나 다른 파이썬 스크립트에 대한 경로를 가지고 있습니다. 메뉴 같은 것. 사용자가 예를 들어 다섯 번째 버튼 인 python5.py를 클릭하면 main.py 스크립트를 닫습니다. 그런 다음 python5.py가 python5.py에서 함수를 끝내면 python5.py가 닫히고 main.py가 열립니다. 이것은 어쩌면 당신이 도울 수있는 적합한 해결책이 될 것입니다. 숨기기 창을 사용한 첫 번째 예는 실제로 흥미 롭습니다. 그러나 열리고 닫아야 할 많은 파이썬 스크립트가있는 경우를 생각해보십시오. 감사. –

+0

더 이상 갈 수 없으면 "닫기"로 의미하는 것을 결정해야합니다. 스크립트가 실제로 실행을 멈출 필요가 있습니까? 또는 주 창을 닫으시겠습니까?아니면 그냥 숨길까요? 왜 그게 필요합니까? 80 년대 후반 스위처 (Switcher) 또는 멀티 파인더 (Multifinder) 이후로 런처/메뉴 앱이 계속 실행되는 것은 꽤 정상적인 일이었습니다. 그들이 가진 GUI는 모두 배경에 있으므로 문제가되지 않습니다. 그리고 이것은 단추의 상태를 제어하는 ​​것만으로 여러 스크립트 실행을 동시에 허용하거나 거부 할 것인지 선택할 수 있음을 의미합니다. 그 디자인이 당신에게 잘못된 것 같아? – abarnert

+0

모든 도움을 주셔서 감사합니다. 이것은 올바른 방향으로 나를 인도 해줍니다. –

관련 문제