【问题标题】:Tkinter Popup Window While Process Runs进程运行时的 Tkinter 弹出窗口
【发布时间】:2021-10-07 23:04:50
【问题描述】:

在 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 运行之前创建窗口,然后在脚本完成时自动关闭?

【问题讨论】:

  • window.destroy() 是脚本的最后一行吗?好像是这样,它符合您的要求;窗口在脚本结束时关闭。
  • 这段代码其实是一个按键触发的函数,但是是的,函数到此结束。但是,按钮缩进(就像它被按下一样)并在 run_a_script.py 运行时保持缩进。当 run_a_script.py 完成时,不会出现弹出窗口。所以,我相信它是在脚本运行后创建然后销毁窗口。
  • 您能否提供 run_a_script.py - 它可能只是在运行脚本,然后它运行得非常快,以至于它在创建后不久就关闭了。

标签: python tkinter


【解决方案1】:

所有 tkinter 更新都由 tkinter mainloop 处理,并且在执行外部脚本期间,tkinter mainloop 直到 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

【讨论】:

  • 效果很好。谢谢你的详细解释!
【解决方案2】:

如果我的解释是正确的,那么您永远不会告诉窗口“出现”。 尝试添加:

window.update_idletasks()
window.update()

window.mainloop()

显示窗口

编辑:另外,为了清晰起见,我通常将 tk.Tk() 用于主窗口,而不是 tk.Toplevel()What's the difference between tkinter's Tk and Toplevel classes?

【讨论】:

  • 啊,我应该使用 tk.Tk() 包含主窗口。这是在主窗口中按下按钮后出现的弹出窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多