2011-08-17 17 views
0

可能性の重複:
How can I monitor Tkinter buttons when Python is busy?私のTkinter GUIが応答しないのはなぜですか?

私は私がボタンを押すと機能が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はmy text.update()を置き換える必要がありますか? – GiannisIordanou

関連する問題