进程运行时弹出窗口



在Tkinter中,我想在初始化进程以运行另一个Python脚本时创建一个窗口,该窗口将在脚本完成时关闭。下面是我到目前为止写的:

window = tk.Toplevel()
window.geometry("400x90")
window.wm_title("Process is Running")
process = subprocess.Popen("python3 run_a_script.py", shell=True)
process.wait()
window.destroy()

脚本正在运行,但弹出窗口从未出现。如果我删除window.destroy(),它确实会在脚本完成后出现,但它不会自动关闭。

是否有办法在run_a_script.py运行之前创建窗口,然后在脚本完成时自动关闭窗口?

所有tkinter更新都由tkintermainloop处理,并且在执行外部脚本期间,tkintermainloop直到window.destroy()之后才采取控制,因此您无法看到窗口,因为当tkinter收回控制时它已被破坏。

要显示外部脚本执行期间的窗口,可以:

  • 在调用subprocess.Popen(...)之前调用window.update_idletasks()以让tkinter显示窗口。但是,在执行外部脚本期间,您不能与GUI交互。
window = tk.Toplevel()
window.geometry("400x90")
window.wm_title("Process is Running")
window.update_idletasks() # show the window
process = subprocess.Popen(["python3", "run_a_script.py"])
process.wait()
window.destroy()
  • 使用.after()定时检查进程是否完成。
window = tk.Toplevel()
window.geometry("400x90")
window.wm_title("Process is Running")
process = subprocess.Popen(["python3", "run_a_script.py"])
def check_process():
if process.poll() is None:
# process is still running, check again 100ms later
window.after(100, check_process)
else:
# prcoess is completed, destroy the window
window.destroy()
check_process() # start the checking

如果我没理解错的话,那么你永远不会告诉窗口"出现"。尝试添加:

window.update_idletasks()
window.update()

window.mainloop()

显示窗口

编辑:另外,我通常使用tk.Tk()tk.Toplevel()为清晰。tkinter's Tk和Toplevel类有什么区别?

最新更新