当shutil复制文件时GUI冻结

时间:2013-09-23 17:40:15

标签: python tkinter progress-bar freeze ttk

def creabackuno():
  startbar()
  messagebox.showinfo( "Wait..","I am creating the backup, please wait...")
  try:
      copytree(path,r"backup\dirbackup1\.minecraft")
      messagebox.showinfo( "OK!","Backup (1) created!")
      stopbar()
  except OSError as exc:
      messagebox.showerror( "Nope!","There is already a backup to restore")
      stopbar()

我的进度条有问题:

startbar()在图形界面上启动进度条,但是当启动shutil(copytree(path,r“backup \ dirbackup1.minecraft”))时,界面冻结和进度条停止直到完成。 感谢

我正在使用python 3.3

抱歉我的英语很差

3 个答案:

答案 0 :(得分:1)

copytree是一个同步函数,因此所有代码执行都将停止,直到完成为止。虽然tkinter很遗憾不是线程安全的,但我建议你把那个命令放在另一个线程中:

from thread import start_new_thread as snt
#from _thread import start_new_thread as snt for python 3

def copy(onError,onEnd):
    try: copytree(path,r"backup\dirbackup1\.minecraft")
    except: 
       onError()
       return
    onEnd()

def onEnd():
    messagebox.showinfo( "OK!","Backup (1) created!")
    stopbar()

def onError():
      messagebox.showerror( "Nope!","There is already a backup to restore")
      stopbar()

#then call with

snt(copy,(onError,onEnd))

如果失败则执行onError,成功时执行onEnd。

答案 1 :(得分:1)

进度条显示什么?如果您要显示复制的文件的百分比,则必须先获取文件的总长度/字节数,然后定期更新复制的字节数。这将需要使用“after”来检查复制到文件的大小每隔这么多毫秒(我想我只是在这里猜测,但首先搜索,因为必须有人已经做过这样的事情。)这是我找到的第一个链接https://mail.python.org/pipermail/tkinter-discuss/2010-December/002613.html它可能比您想要的更多,但应该有所帮助。

答案 2 :(得分:0)

在每个self.Frame.update_idletasks()语句后使用self.pgBar.step(x),其中'x'代表进度条值增加的值