Python Tkinter Gui在使用shutil复制文件时停止
我的tkinter GUI程序运行良好,直到达到将指定文件复制到目标的功能为止。在那之后它冻结了,在复制完成之前我不能对我的程序做任何事情。它可以很好地处理小文件,但对较大的文件很恼火 复制文件时如何使GUI响应 这是我的程序示例Python Tkinter Gui在使用shutil复制文件时停止,python,tkinter,Python,Tkinter,我的tkinter GUI程序运行良好,直到达到将指定文件复制到目标的功能为止。在那之后它冻结了,在复制完成之前我不能对我的程序做任何事情。它可以很好地处理小文件,但对较大的文件很恼火 复制文件时如何使GUI响应 这是我的程序示例 from Tkinter import * root = Tk() def copy(): copy(src, dst) if something: copy() else: something... ..... .... ro
from Tkinter import *
root = Tk()
def copy():
copy(src, dst)
if something:
copy()
else:
something...
.....
....
root.mainloop()
Pff,没有真正的代码很难说,但您的问题似乎是tkinter GUI通常需要运行其主循环才能完全运行。 当您使用大量回调时,tkinter会停止事件循环,等待回调返回,而文件复制是一项繁重且耗时较长的操作 因此,解决方案是尽可能地将其与mainloop分离。通常的做法是在单独的线程中生成复制操作。您可以使用_-thread或threading,第二种方法似乎更简单:
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方法的检查回调)
始终发布您的代码!我想,这只是一个没有参数的函数,没有来自shutil的copy命令。这能解决你的问题吗:我使用Proecess(target=copy),启动并加入它,其中copy是复制文件的函数,但它会再次启动根窗口。。我不知道你的程序代码到底出了什么问题。如果您有一个按钮和一个用于该按钮的命令处理程序,并且该处理程序在不启动后台任务的情况下进行复制,那么GUI将没有响应,直到该命令处理程序返回。
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)()