2013-11-21 3 views
2

는 정말 ... 내가 두 개의 버튼으로 창을 열고라는 버튼을 클릭 할 때이 registerSomeKeyPresses.py라는 스크립트를 실행 "일부 키 입력을 등록"을 잃었어요, BUUUUT 한 번 내가 그 실행을 닫으려면 완료 하지만 .... ... 그것은 나를 위해 불가능 되 고 표시창을 닫고 다른 창에서 실행을 계속 하시겠습니까?

, 내가 reaaaally 어떤 도움을 주셔서 감사합니다 것이다 ...

감사를 첫 번째 창을 계속!

#!/usr/bin/env python 
from Tkinter import * 
import threading 

v0 = Tk() 

def finishApplication(): v0.destroy() 
def registerSomeKeyPresses(): 
t = threading.Thread(target=execfile("registerSomeKeyPresses.py")) 

t.start() 

def waitAndRun(f): v0.after(200, f) 

b1=Button(v0,text="TERMINAR APLICACION",command=lambda: finishApplication()).pack() 

button_keyPresses=Button(v0,text="REGISTER SOME KEY PRESSES",command=lambda:    waitAndRun(registerSomeKeyPresses())).pack() 

v0.mainloop() 

================ registerSomeKeyPresses.py ====================== ===

Do several things and last command: 

io.quit() 

답변

0

편집 한

귀하의 코멘트에 대한 응답으로 두 번째 시도 :

from Tkinter import * 
from subprocess import call 
import sys 

t = Tk() 
def click(): 
    t.iconify() 
    try: 
     call([sys.executable, 'script.py']) 
    finally: 
     t.deiconify() # if it should close do t.quit() and t.destroy() 
b = Button(t, command= click) 
b.pack() 

t.mainloop() 

오래된 버전

그 기능은 무엇입니까

?

================ registerSomeKeyPresses.py ===========================

v0.quit() 
v0.destroy() 
io.mainloop() 

타 오류는 다음과 같습니다

threading.Thread(target=execfile, args = ("registerSomeKeyPresses.py",)) 

당신이 정말로 스레드를 neeed합니다. tkinter mainloop을 쓰레드와 함께 사용하지 마십시오. 쓰레드는 event_generate - thats safe를 사용할 수 있습니다.

+0

안녕하세요! 의견을 보내 주셔서 감사합니다. 내가하고 싶은 것을 분명히 알고 있지만 구현 방법을 모르겠습니다. 스레드/tkinter를 잘못 사용할 수 있습니다. 뭘 원하는지 : 1) 버튼이있는 창을 표시합니다. 버튼을 클릭 할 때마다 외부 .py에 대한 호출이 수행됩니다. 2) 외부 .py가 실행되어 모든 화면이 표시됩니다. 3) .py가 끝나면 버튼이있는 창으로 돌아가고 싶습니다. --- 3 단계 나는 --- 그것을 어떻게 감사를 몰라! – MaRie

+0

질문을 구체화 할 수 있습니다. 그것은 다른 사람들에게도 도움이 될 것입니다. – User

0

당신은 Tk의 인스턴스를 파괴 할 때, 당신을 programm 것이다 (그리고해야) 종료합니다. 창을 만들고 파괴하려면 창을 활성 상태로 유지하면서 Toplevel의 인스턴스를 만들고 파괴하십시오. 주 창을 보지 않으려면 숨길 수 있습니다.

또한, Tkinter를 스레드 잘 혼합하지 않습니다. 다른 스레드에서 위젯에 대한 메소드를 호출 할 수 없습니다. 다른 사람들이 당신이 다른 스레드에서 event_generate를 호출 할 수 있다고 들었지만, 다른 스레드에서 호출 할 수있는 tkinter 함수라고 생각합니다.

+0

이것은 여기에서 논의되었습니다 : https://mail.python.org/pipermail/tkinter-discuss/2013-November/thread.html – User

+0

안녕하세요! Tk와 Toplevel의 인스턴스에서이 작업을 수행 할 수있는 것 같습니다. 3) 한 번.py가 끝났습니다. 버튼이있는 창으로 돌아가고 싶습니다. --- 3 단계 어떻게 해야할지 모르겠다. --- 나는 이렇게하려고했지만, 다시 시도해 보겠다. 감사합니다. – MaRie

+0

@ 마리 : Tk의 인스턴스가 정확히 하나만 있어야하며, 프로그램을 종료 할 준비가 될 때까지는 파기해서는 안됩니다. 일단 윈도우를 표시하고 사라지게하려면 Toplevel의 인스턴스를 사용하십시오. –

관련 문제