2017-11-15 18 views
3

GUI로 Tkinter를 사용하여 파이썬으로 일부 드라이브를 프로그래밍 중입니다. 내 컴퓨터가 실행 중일 때 함수를 완료 한 후 닫아야하는 정보가있는 최상위 창을 사용자에게 보여주고 싶습니다. 이것은 내 최소한의 예입니다 :Python Tkinter, 함수 다음에 toplevel을 파기하십시오.

from Tkinter import * 
import time 


def button_1(): 
    window = Toplevel() 
    window.title("info") 
    msg = Message(window, text='running...', width=200) 
    msg.pack()  
    time.sleep(5.0) 
    window.destroy() 

master = Tk() 
frame = Frame(width=500,height=300) 
frame.grid() 
button_one = Button(frame, text ="Button 1", command = button_1) 
button_one.grid(row = 0, column = 0, sticky = W + E) 
mainloop() 

주요 문제는 5 초가 지나면 최상위 창이 나타납니다. 어떤 제안? 감사합니다.

+0

코드가 원하는대로 작동하지 않는다고 생각하십니까? 함수가 완료된 후 '자체'를 닫거나 함수를 닫음으로써 함수를 완료합니다. – Nae

답변

2

time.sleep(5)이 GUI가 업데이트되기 전에 실행되기 때문에 최고 레벨은 5 초가 지나면 나타납니다. 이 문제를 해결하려면 업데이트를 강제로 수행하려면 time.sleep(5) 앞에 window.update_idletasks()을 추가하면됩니다.

그러나 Bryan Oakley가 대답 한 바에 따르면 time.sleep(5)이 실행되는 동안 GUI가 고정되어 있습니다. 나는 당신의 궁극적 인 목적이 time.sleep을 실행하지 않는다고 생각하지만 약간의 시간이 걸리는 작업입니다. after를 사용하여 GUI를 동결하고 싶지 않지만 실행이 얼마나 걸릴지 모르는 경우에 따라서, 당신은 분리 된 스레드에서 함수를 실행할 수 있으며이 완료 여부를 정기적으로 확인 :

import Tkinter as tk 
import time 
import multiprocessing 

def function(): 
    time.sleep(5) 


def button_1(): 
    window = tk.Toplevel(master) 
    window.title("info") 
    msg = tk.Message(window, text='running...', width=200) 
    msg.pack() 
    thread = multiprocessing.Process(target=function) 
    thread.start() 
    window.after(1000, check_if_running, thread, window) 


def check_if_running(thread, window): 
    """Check every second if the function is finished.""" 
    if thread.is_alive(): 
     window.after(1000, check_if_running, thread, window) 
    else: 
     window.destroy() 


master = tk.Tk() 
frame = tk.Frame(width=500,height=300) 
frame.grid() 
button_one = tk.Button(frame, text ="Launch", command=button_1) 
button_one.grid(row = 0, column = 0, sticky = "we") 
master.mainloop() 
1

일반적인에게 엄지 손가락의 규칙은 GUI가 실행중인 스레드에서 sleep을 절대로 호출해서는 안된다는 것입니다. 이유는 정확히 sleep은 전체 프로그램을 잠자기 상태로 만듭니다. 이는 창을 새로 고치거나 모든 이벤트에 대응할 수 없음을 의미합니다.

일정 기간 후에 수행하려는 경우 올바른 방법은 after입니다. 예를 들어, 이렇게하면 5 초 후에 창이 사라집니다.

window.after(5000, window.destroy) 
+0

답변 해 주셔서 감사합니다. 이것은 단지 최소한의 예일뿐입니다. 저는 실제 프로그램에서 잠을 자지 않습니다. 나는 더 복잡한 함수를 호출하는데, 이는 명확한 시간이 지나면 끝난다. – JohannesB