Python Tkinter Gui在使用shutil复制文件时停止

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

我的tkinter GUI程序运行良好,直到达到将指定文件复制到目标的功能为止。在那之后它冻结了,在复制完成之前我不能对我的程序做任何事情。它可以很好地处理小文件,但对较大的文件很恼火

复制文件时如何使GUI响应

这是我的程序示例

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