【问题标题】:How can I close a Tkinter window without killing my process?如何在不终止进程的情况下关闭 Tkinter 窗口?
【发布时间】:2020-11-06 21:04:41
【问题描述】:

我有一个用 Tkinter 编写的可视化工具。通常,我独立执行它,然后在完成后手动关闭窗口。但是,我想从另一个 Python 程序调用它,执行一次主循环(并将画布保存为 SVG),然后关闭窗口,让程序继续。
如果我什至懒得打开一个窗口,而只是重新使用我的代码来绘制一个 SVG,那也可以。

我的 tk 应用程序如下所示:

class MainApplication(tk.Frame):

    def __init__(self, output_path, parent=None):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        # draw visualization, save as svg
        #...
        #



从我的代码的另一部分,我调用了

kill = True

root = tk.Tk()
root.title("Placement Visualizer")
MainApplication(output_path, root ).pack(side="top", fill="both", expand=True)
    
if kill:
    root.destroy()
root.mainloop()

我收到此错误:Tcl_AsyncDelete: async handler deleted by the wrong thread Aborted (core dumped) 我试过使用 root.quit() 或删除 root.mainloop(),但我没有得到想要的结果。 谢谢

【问题讨论】:

  • 一般情况下,您不应在 tkinter 应用程序中多次调用 Tk() — 请参阅 Why are multiple instances of Tk discouraged? — 在我看来,这会使您的问题没有实际意义。
  • 我删除了来自if __name__ == "__main__' 的电话。无争议
  • 销毁后无法调用root.mainloop()
  • 你读过这个问题吗?
  • 是的。你不能“一次主循环”。 Tkinter 不是那样工作的。 mainloop() 必须继续运行,直到程序退出。届时,将使用调用 mainloop() 之后的任何代码继续执行。

标签: python tkinter tkinter-canvas


【解决方案1】:

在“我的代码的另一部分”中:

if kill:
    root.quit()
else:
    root.mainloop()

根本不打开窗口,而是绘制所有内容并保存 SVG,只需调用 root.quit()。要正常打开窗口(并且必须关闭它,杀死进程),调用 root.mainloop()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2021-04-17
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多