如何通过messagebox.showerror创建类似filedialog的模态对话框?
解决Tkinter MessageBox非模态问题,实现类似FileDialog的锁定效果
我懂你的痛点——用messagebox.showerror()弹出错误提示时,主窗口居然还能随便拖动、操作,这完全不是模态对话框该有的样子,毕竟filedialog.askopenfilename()这种对话框弹出来时,主窗口可是完全被锁住的对吧?
问题根源
默认情况下,tkinter.messagebox的对话框如果没有指定父窗口(parent),它会创建一个独立的顶层窗口,和你的主应用窗口没有绑定关系,所以主窗口自然还能正常操作。而filedialog系列函数你在调用时虽然没显式写parent,但其实它默认会关联当前的主窗口,所以是模态的。
解决方案
调用messagebox方法时,把你的主应用窗口实例(也就是Application类里的self)作为parent参数传进去就行,这样对话框就会以主窗口为父级,变成真正的模态对话框,主窗口会被完全锁定,必须先关闭对话框才能继续操作主窗口。
修改后的代码示例
假设你是在Application类的某个方法里调用的messagebox,只需要加个parent=self参数:
# 原来的代码 messagebox.showerror("Error", "No downloader.exe found") # 修改后的代码(实现模态效果) messagebox.showerror("Error", "No downloader.exe found", parent=self)
效果验证
修改后再运行程序,当弹出“No downloader.exe found”的错误框时,你的主窗口会完全无法移动、点击,必须先关闭这个错误提示框,才能继续操作主窗口,和filedialog.askopenfilename()的模态行为完全一致啦!
内容的提问来源于stack exchange,提问作者Castle Odinland
相关产品推荐
相关产品推荐

