我如何暂停我的代码,直到顶层窗口被销毁?

问题描述 投票:0回答:1

所以:我尝试将 Error-Masseges 添加到我的代码中。我想在单独的 tkinter 顶级窗口中显示其中的每一个。到目前为止一切顺利。

但是为此,我需要在创建错误窗口后暂停我的代码,并等待用户按下错误窗口中的“确定”按钮才能继续。只有这样代码才可以继续运行。

我遇到问题的错误窗口的创建是在另一个 tkinter 窗口的主循环内。如果没有巨大的问题,后者就无法被销毁。有人能为我提供解决方案吗?我是否可能对蟒蛇之神犯下了罪孽? 我可以暂停主循环吗?

我尝试了 wait_window(win) (顺便说一句:它是做什么的?它似乎不像我理解的那样工作。它不是应该等待给定的窗口被销毁吗?)

另外 wait() 对我不起作用。

我的编码感觉告诉我它与 主循环中的主循环有关。不幸的是,相关代码太长了,无法将其发布到此处,并且使用示例进行重新创建将是一个巨大的麻烦。我希望我的描述足够具体。

我也尝试过研究,但由于某种原因,似乎没有人遇到完全相同的问题。有类似的但没有解决方案帮助我。

如果确实需要示例,请告诉我或否决我的问题,然后我会尽力使核心问题尽可能短。

python tkinter pause toplevel mainloop
1个回答
0
投票

首先,您不应多次致电

mainloop
。此外,您不应创建多个
Tk
实例。目前尚不清楚您是否这样做。

要等到窗口被销毁,您可以使用

wait_window
方法。如果您正在创建错误对话框,您可能还想执行“抓取”操作。这意味着您希望所有事件都集中到该小部件中,以便用户在确认对话框之前无法与其他小部件交互。 要进行抓取,请调用

grab_set

方法。当窗口被破坏时,抓取器会自动释放。

以下示例说明了此技术。请注意,仅当未显示该对话框时,您才能单击主窗口中的按钮。一旦显示了对话框,创建它的函数将不会返回,直到对话框窗口被销毁。

当您以这种方式创建窗口时,该对话框被视为

模式对话框

。即:它进入一种模式,在窗口被销毁之前不会发生任何其他事情。 import tkinter as tk def show_error(message="Danger Will Robinson!"): toplevel = tk.Toplevel(root) message = tk.Label(toplevel, text=message, bd=2, relief="groove") button = tk.Button(toplevel, text="Ok", command=toplevel.destroy) button.pack(side="bottom") message.pack(side="top", fill="both", expand=True, ipadx=10, ipady=10, padx=10, pady=10) print("waiting for window to be destroyed...") toplevel.grab_set() toplevel.wait_window() print("done waiting") root = tk.Tk() button = tk.Button(text="Click me", command=show_error) button.pack(padx=20, pady=20) tk.mainloop()

© www.soinside.com 2019 - 2024. All rights reserved.