为了简化事情,我们忽略Tkinter和使用了一个单独线程的事实。在
这种情况下,应用程序会生成一个子进程来执行外部程序(机器人复制.exe在这个问题中),你需要在某个事件(当Tkinter应用程序在这个问题中关闭时)停止你的应用程序。在
这需要一个进程间通信机制,因此将通知生成的进程事件,并相应地作出反应。一种常见的机制是使用操作系统提供的信号。在
您可以向外部进程发送一个信号(SIGTERM),并请求它退出。假设程序按预期对信号做出反应(大多数编写良好的应用程序都会这样做),您将获得所需的行为(进程将终止)。在
在子进程上使用terminate方法将当前平台的适当信号发送给子进程。在
您需要引用onQuit函数中的子流程对象proc(从提供的代码中我看到{}是一个函数而不是对象方法,因此它可以使用一个全局变量来访问proc),这样就可以调用进程的terminate方法:def onQuit(self):
global t1, proc
if t1.isAlive():
pass
# by the way I'm not sure about the logic, but I guess this
# below statement should be an elif instead of if
if tkMessageBox.askyesno("Title", "Do you really want to exit?"):
proc.terminate()
self.destroy()
self.master.destroy()
这段代码假设您在全局范围内存储对子进程的引用,因此您还必须修改CopyFiles。在
我不确定robocopy如何处理终止信号,我猜这不是我们能控制的。在
如果您对外部程序有更多的控制(可以修改源代码),那么可能会有更多的选项,例如使用stdio发送消息,或使用共享内存等