2011-08-17 18 views
0

可能重复:
How can I monitor Tkinter buttons when Python is busy?为什么我的Tkinter gui没有回应?

我有Tkinter的GUI代码一个问题,我wrote.It当我按下一个按钮,该函数是executed.Here停止响应是一个示例代码使事情更清晰:

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

相关问题