首页 > 解决方案 > 您如何在 python 中使 exptions 静音,但仍执行操作?

问题描述

出于某种原因,使用按钮关闭 tkinter 弹出窗口需要您更新窗口以关闭它(否则它只会坐在那里),但调用 update 来关闭窗口会引发异常。

我尝试了以下方法,它有效但引发了一个异常,我不能在最终产品中拥有它:

Button1 = ttk.Button(popupWindow, text="Close", command=popupWindow.destroy)
Button1.pack(expand = Y)
while popupWindow:
      time.sleep(0.1)
      popupWindow.update()

我也尝试了明显的 try/except 方法:

Button1 = ttk.Button(popupWindow, text="Close", command=popupWindow.destroy)
Button1.pack(expand = Y)
while popupWindow:
      time.sleep(0.1)
      try:
           popupWindow.update()
      except:
           pass

这只会导致程序挂起并变得无响应,就好像它正在等待调用 popupWindow.update() 一样。有没有办法让引发的异常保持沉默?

标签: pythonexceptiontkinter

解决方案


您不应该使用 while 循环sleepupdate来等待按钮单击或等待窗口消失。这些是您看到的异常的根本原因。

Tkinter 具有专门用于此目的的功能。通过使用这些功能之一,您不必尝试捕获异常,因为不会引发异常。

在您的情况下,您似乎想要等待一个小部件被销毁。您可以使用 tkinter 的 'wait_window` 函数,它正是这样做的——它等待一个窗口被销毁。

这是一个人为的弹出窗口示例。当您创建它时,它会在其父窗口上居中一个新窗口,然后等到该窗口被销毁。此示例使用 aFrame作为基础,但您也可以使用ToplevelorCanvas或任何其他小部件。

import tkinter as tk

class PopupWindow(tk.Frame):
    def __init__(self, parent, message):
        tk.Frame.__init__(
            self, parent,
            borderwidth=2, relief="raised",
            background="bisque",
        )
        label = tk.Label(self, text=message, bg=self.cget("background"))
        ok_button = tk.Button(self, text="Ok", command=self.destroy)

        ok_button.pack(side="bottom", pady=10)
        label.pack(side="top", padx=20, pady=20)

        # center this widget on parent window
        self.place(relx=.5, rely=.5, anchor="center")

        # wait until the window has been destroyed
        self.wait_window(self)

这是使用此小部件的示例:

import tkinter as tk

class Example():
    def __init__(self):
        self.root = tk.Tk()
        self.root.geometry("400x400")

        button = tk.Button(self.root, text="Do Something", command=self.do_something)
        button.pack(side="top")

        self.root.mainloop()

    def do_something(self):
        print("doing something...")
        print("waiting...")
        popupWindow = PopupWindow(self.root, "Click button to continue")
        print("done waiting...")

ex = Example()

推荐阅读