如何调用tkinter messagebox时阻止默认主窗口弹出?
解决Tkinter MessageBox弹出时默认主窗口显示的问题
要阻止那个带羽毛图标的默认"tk"主窗口弹出,核心思路是隐藏Tk根窗口——因为MessageBox必须依赖一个Tk根窗口才能运行,我们只需要让这个根窗口不显示即可,有两种简单实现方式:
方式一:隐藏自定义的主窗口
在你的app1类初始化中,添加代码隐藏窗口:
import tkinter as tk from tkinter import messagebox import pyodbc class app1(tk.Tk): def __init__(self, *args, **kwargs): try: tk.Tk.__init__(self, *args, **kwargs) self.withdraw() # 隐藏主窗口 connection(self) self.cursor.execute('SELECT 1') # 若后续需要显示主窗口,可调用 self.deiconify() except: messagebox.showerror(title='Error', message='An error has occured') self.destroy() # 出错后销毁窗口,避免残留进程 class connection(): def __init__(self, controller): try: driver_name = '' driver_names = [x for x in pyodbc.drivers() if x.endswith(' for SQL Server')] if driver_names: driver_name = driver_names[0] controller.conn = pyodbc.connect(f'Driver={driver_name}; ' 'Server=1.1.1.1\TEST,9400;' 'Database=Test;' 'pool_pre_ping=True;' 'pool_recycle=3600;' 'UID=test;' 'PWD=test;', timeout=1 ) controller.cursor = controller.conn.cursor() except: messagebox.showerror(title='Error', message='An error has occured') controller.destroy() # 出错后销毁窗口 if __name__ == "__main__": app = app1() app.mainloop()
方式二:创建临时隐藏的根窗口(无需继承Tk)
如果程序不需要主窗口,仅用MessageBox提示,可直接创建临时隐藏的根窗口:
import tkinter as tk from tkinter import messagebox import pyodbc def connection(): try: driver_name = '' driver_names = [x for x in pyodbc.drivers() if x.endswith(' for SQL Server')] if driver_names: driver_name = driver_names[0] conn = pyodbc.connect(f'Driver={driver_name}; ' 'Server=1.1.1.1\TEST,9400;' 'Database=Test;' 'pool_pre_ping=True;' 'pool_recycle=3600;' 'UID=test;' 'PWD=test;', timeout=1 ) cursor = conn.cursor() cursor.execute('SELECT 1') except: messagebox.showerror(title='Error', message='An error has occured') if __name__ == "__main__": root = tk.Tk() root.withdraw() # 隐藏根窗口 connection() root.mainloop()
关键说明
self.withdraw():将Tk窗口从屏幕移除,但窗口仍存在,可通过self.deiconify()重新显示。- 出错后调用
self.destroy():确保程序退出时销毁窗口,避免后台残留Tk进程。
内容的提问来源于stack exchange,提问作者Lzypenguin
相关产品推荐
相关产品推荐

