python - 您如何在 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() 一样。有没有办法让引发的异常保持沉默?
解决方案
您不应该使用 while 循环sleep
和update
来等待按钮单击或等待窗口消失。这些是您看到的异常的根本原因。
Tkinter 具有专门用于此目的的功能。通过使用这些功能之一,您不必尝试捕获异常,因为不会引发异常。
在您的情况下,您似乎想要等待一个小部件被销毁。您可以使用 tkinter 的 'wait_window` 函数,它正是这样做的——它等待一个窗口被销毁。
这是一个人为的弹出窗口示例。当您创建它时,它会在其父窗口上居中一个新窗口,然后等到该窗口被销毁。此示例使用 aFrame
作为基础,但您也可以使用Toplevel
orCanvas
或任何其他小部件。
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()
推荐阅读
- php - Mysql 在发送快速请求时返回相同的行
- javascript - 我如何禁用标签成员
- tensorflow - ML.NET/AI 读取文档/文档分割
- redux - 如何在 redux 中执行依赖异步调用?
- c# - 使用 c# 打开外部 exe 并自动运行命令
- c++ - Qt 5.11 - QML - 在 treeView 中将 XML 文件显示为 QAbstractItemModel
- android - Android - 确保元素是固定的
- python - 熊猫使用分隔符“;” 失去一些价值
- c# - WPF:防止在 TextChanged 上更新 SelectedItem
- abp - 我的班级 ***UserSynchronizer 像 abp 模块 cms-kit 中的 CmsUserSynchronizer 不执行