2011-08-17 6 views
0

가능한 중복 :
How can I monitor Tkinter buttons when Python is busy?내 Tkinter GUI가 응답하지 않는 이유는 무엇입니까?

I가 나는 버튼을 누르고 함수 executed.Here 때 응답하지 wrote.It의 Tkinter GUI 코드에 대한 문제가이 예시적인 코드

from Tkinter import* 
import Tkinter as tk 
import tkFileDialog 
import urllib 
import urllib2 


list1 =["urls of video files"] 


def run(): 
    for links1 in list1: 
    text1.insert(str(list1.index(links1)+1)+'.end', 'video_'+str(list1.index(links1)+1)+'.mp4'+'.........Downloading') 
     text1.update()#Update text widget 
     urllib.urlretrieve(links1.split('\">')[0],'video_'+str(list1.index(links1)+1)+'.mp4') 
     text1.insert(str(list1.index(links1)+1)+'.end','.....Finished\n') 
     text1.yview(END) 
    text1.insert(END,'>>All files have been downloaded.Enjoy ! ! !\n') 


#Window Title  
app=Tk() 
app.title("Title") 
app.geometry('700x400+200+200') 
app.resizable(0,0) 



button=Button(app,text="Press me",font=("Times", 12, "bold"),width=20,borderwidth=5,command=run) 
button.pack(padx=5,pady=8) 


frame1 = Frame(app, width=600, height=200) 
xframe1 = Frame(frame1, relief=RAISED, borderwidth=5) 


text1 = Text(frame1,height = 3,font=("Times", 12)) 
text1.insert(END,"") 
text1.pack(side=LEFT,fill=Y) 


s_start = Scrollbar(frame1) 
s_start.pack(side=RIGHT,fill=Y) 
s_start.config(command=text1.yview) 
text1 .config(yscrollcommand=s_start.set) 

Label(frame1, text='').place(relx=1.06, rely=0.125,anchor=CENTER) 
frame1.pack() 

app.mainloop() 

답변

1

이 질문은 중복되므로 원본 답변을 참조하십시오. 짧은 대답 : 창은 다시 그리기 이벤트를 처리 할 수 ​​있도록 이벤트 루프를 실행해야하지만 루프가 실행되는 동안 이벤트 루프가 중지됩니다.

는 의견에 질문에 대답하려면 :

이벤트 루프는 mainloop를 호출 할 때 실행되는 무한 루프입니다.

while True: 
    event = event_queue.pop() 
    event.process() 

(이 정말 문자 그대로 event_queue라는 전역 객체가 아니므 찾고하지 않을 경우에는 ...)

run가 실행되고, 그것은 것입니다 : 그것은 다음과 같이 보입니다 상상의 event.process() 방법으로 실행하십시오. 텍스트 삽입과 같은 코드에서 위젯을 업데이트 할 때 위젯은 이 아니며 즉시 렌더링됩니다. 대신 "다시 그리기"이벤트가 큐에 추가됩니다. 그러나 run 함수가 실행 중일 때 이벤트 루프의 event.process() 부분에 고정되어 있으므로 다른 이벤트가 처리되지 않습니다. 따라서 함수가 종료되고 다음 이벤트가 큐에서 제거 될 때까지 화면의 다시 그리기가 발생하지 않습니다.

이제 함수에서 update을 실행하면 이벤트 루프가 시작되고 이러한 이벤트가 처리됩니다. 무한 루프 내부에 잠재적으로 무한 루프가 있기 때문에 이것은 나쁠 수 있습니다. 그러나 update_idletasks을 호출하면 "유휴"작업 만 처리됩니다. 다시 그리기 이벤트는이 범주에 속하므로 처리되지만 버튼 클릭과 마우스 이동 같은 것은 이 아니며이 처리됩니다.

+0

안녕하세요, 조금 더 설명해 주실 수 있습니까? 루프는 무엇이고 이벤트 루프는 무엇입니까? 고마워요. – GiannisIordanou

+0

@evil_inside : 답변을 업데이트했습니다. –

+0

그래서 update_idletasks가 내 text.update()를 대체해야합니까? – GiannisIordanou

관련 문제