为什么我的Tkinter gui没有响应?

2024-05-14 22:39:10 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
How can I monitor Tkinter buttons when Python is busy?

我对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()

Tags: textimportappindextkintervideostartpack
1条回答
网友
1楼 · 发布于 2024-05-14 22:39:10

这个问题是重复的,所以请看原问题的答案。简短回答:窗口需要运行事件循环,以便可以处理重画事件,但当循环正在运行时,事件循环将停止。在

要回答评论中的问题:

事件循环是在调用mainloop时运行的无限循环。看起来像这样:

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

(实际上并没有一个名为event_queue的全局对象,所以不要去找它…)

run正在运行时,它正在假想的event.process()方法内运行。当您从代码(如插入文本)更新小部件时,该小部件将被立即重绘。相反,一个“重画”事件被添加到队列中。但是,当您的run函数正在运行时,您被困在事件循环的event.process()部分,因此没有其他事件被处理。因此,在函数退出并将下一个事件从队列中拉出之前,不会重新绘制屏幕。在

现在,如果在函数中运行update,它将启动一个新的事件循环,这些事件将被处理。这可能很糟糕,因为在无限循环中有一个潜在的无限循环。但是,如果调用update_idletasks,则只会处理“空闲”任务。重画事件属于这一类,因此它们会被处理,但是像按钮点击和鼠标移动之类的事情是而不是处理的。在

相关问题 更多 >

    热门问题