2016-07-26 29 views
-1

私のtkinter GUIプログラムは、指定されたファイルを宛先にコピーする機能に達するまでうまく動作します。その後、フリーズして、コピーが終了するまで私のプログラムで何もできません。小さなファイルではうまく動作しますが、大きなファイルでは問題ありません。Tkinter GUIがshutilでファイルをコピーしている間に停止する

ファイルのコピー中にGUIを応答させるにはどうすればよいですか?

は、ここでプログラム

from Tkinter import * 

root = Tk() 

def copy(): 
    copy(src, dst) 

if something: 
    copy() 
else:  
    something... 

..... 
.... 

root.mainloop() 
+0

常にあなたのコードを投稿してください! – Jonas

+0

私はシャットルからのコピーコマンドを持つパラメータを持たない単純なfuntionです。 –

+0

これはあなたの問題を解決するかどうか:http://stackoverflow.com/questions/11756802/leave-some-code-running-while-executing-more – Jonas

答えて

0

PFF、実際のコードなしで伝えるのは難しいの私のサンプルですが、あなたの問題はそのTkinterののGUIは通常、自分のメインループが完全に動作する実行している必要があるようです。 重度のコールバックを使用すると、tkinterは、コールバックが戻るためのイベントループ待機を停止し、ファイルのコピーは重くて長時間の操作です。

それで解決策は可能な限りメインループから切り離すことです。一般的な方法は、別のスレッドでコピー操作を開始することです。あなたが_threadまたはスレッドでそうすることができ、第二には、単純であるように思わ:このような

def copy_callback(from_, to, lock): 
    th = threading.Thread(target=copy_thread, args=(from_, to, lock)) 
    th.start() 


def copy_thread(from_, to, lockobj): 
    with lockobj: 
     shutil.copy(from_, to) 

root = tkinter.Tk() 
lock = threading.Lock() # this one monitores finish of copy operation 
tkinter.Button(root, text='start copy', command=lambda: copy_callback(src, dst, lock)).pack() 
root.mainloop() 

何かが、それは(必要に応じて独自のロジックを追加することができます)例外をコピー処理しません。そして、GUIの操作の終了を知らせるためにロックの状態を確認する必要があります(たとえば、tkiterのafterメソッドを使用したチェックコールバック)

def check_callback(inst, lock, waittime): 
    def check(): 
     if lock.acquire(blocking=False): 
      inst['text'] = 'Success!' 
      lock.release() 
     else: 
      inst.after(waittime, func=check) 
    return check 

l = tkinter.Label(root, text='Copying...') 
l.pack() 
check_callback(l, lock, 100)() 
+0

ありがとうございました。 –

関連する問題