与MessageBox错误窗口关闭TKINTER窗口



在我的脚本中,我有时会调用我的ErrorWindow类以显示错误消息。这创建一个空的tkinter窗口和一个messagebox错误窗口。我要么只想要messagebox窗口,要么我希望tkinter窗口在关闭错误窗口时自动关闭。我尝试了两个代码:

class ErrorWindow:
    def __init__(self,error_message):
        self.error_window = tk.Tk()
        messagebox.showerror("ERROR",error_message,command=self.close)
        self.error_window.protocol("WM_DELETE_WINDOW", self.close)
        self.error_window.mainloop()
    def close(self):
        self.error_window.destroy()

class ErrorWindow:
    def __init__(self,error_message):
        messagebox.showerror("ERROR",error_message) #automatically creates a tk window too

,但即使使用第二个,我关闭messagebox后,tkinter窗口仍保留。

如何编程课程,以便我只需要按下一个按钮(窗口右上方的OkX(一次关闭所有窗口(无论是一个或两个(吗?

您需要withdraw主窗口:

class ErrorWindow:
    def __init__(self,error_message):
        if not tk._default_root: # check for existing Tk instance
            error_window = tk.Tk()
            error_window.withdraw()
        messagebox.showerror("ERROR",error_message)

这没有作为课程的业务。您应该重新制作一个简单的功能。

您没有指定您可能想要一个错误消息的地方或多个地方。如果后者,您只需创建和撤回一次TK窗口。我相信包装器功能而不是类应该足以满足您的目的。

import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
# consider placing root to control where messagebox appears
root.withdraw()
def showerror(message):
    messagebox.showerror('XYZ ERROR', message, parent=root)

为了避免可能的问题,我始终使用明确的 masterparent,而永远不要依赖_default_root

下面的小功能将完成工作。通过设置可以选择的类型:信息,警告或错误消息框,默认值为"信息"。您还可以设置超时,默认值为2.5秒。

def showMessage(message, type='info', timeout=2500):
    import tkinter as tk
    from tkinter import messagebox as msgb
    root = tk.Tk()
    root.withdraw()
    try:
        root.after(timeout, root.destroy)
        if type == 'info':
            msgb.showinfo('Info', message, master=root)
        elif type == 'warning':
            msgb.showwarning('Warning', message, master=root)
        elif type == 'error':
            msgb.showerror('Error', message, master=root)
    except:
        pass

将功能称为以下内容:有关消息类型的"信息"和2.5秒的超时:

showMessage('Your message')

或通过您自己的设置类型消息"错误"和超时4秒:

showMessage('Your message', type='error', timeout=4000)

最新更新