Python 如何强制关闭顶级窗口的消息框

Python 如何强制关闭顶级窗口的消息框,python,tkinter,toplevel,Python,Tkinter,Toplevel,我这里有几行代码,这是一个工作正常的登录系统,但是当我提供了错误的密码而没有关闭messagebox时,我可以多次单击Toplevel按钮。我如何才能使它关闭messagebox,然后才能再次尝试 from tkinter import * from tkinter import messagebox def top(): if entry1.get() == "333": log.destroy() root.deiconify() else:

我这里有几行代码,这是一个工作正常的登录系统,但是当我提供了错误的密码而没有关闭
messagebox
时,我可以多次单击
Toplevel
按钮。我如何才能使它关闭
messagebox
,然后才能再次尝试

from tkinter import *
from tkinter import messagebox


def top():
    if entry1.get() == "333":
       log.destroy()
       root.deiconify()
    else:
       messagebox.showerror("error", "try again")


root = Tk()
root.geometry("300x300")

log = Toplevel(root)
log.geometry("200x200")


label1 = Label(log, text="password")
entry1 = Entry(log)
button1 = Button(log, text="login", command=top)

label1.pack()
entry1.pack()
button1.pack(side="bottom")

lab = Label(root, text="welcome bro").pack()


root.withdraw()
root.mainloop()

您需要使日志窗口成为对话框的父窗口:

messagebox.showerror("error", "try again", parent=log)

默认情况下,它将使用根窗口(
Tk
实例)作为父窗口,在这种情况下,这不是您想要的。

根据@furas的提示,这是如何实现的:

创建另一个函数以在条目不匹配时调用它,并对顶级窗口使用grab_set方法
tp.grab_set()
。您可以将自定义图像添加到顶级窗口以及要在框中显示的消息(此处:我使用标签来描述该信息)


可能与我尝试的grab_set()和wait_window()重复,但它不起作用。
grab_set()
如果您使用
Toplevel()
构建自己的消息框,则应该可以工作-请参见:在Linux上,我无法多次单击
登录
按钮-我必须关闭
消息框
。因此,这可能取决于系统。当我再次单击根窗口时,它会使窗口冻结,除非我在可以再次运行之前使用任务管理器关闭它。我的答案是针对您发布的代码的,无法单击根窗口,因为它已被撤回。此答案可能是OS factor am使用Windows 7。当您多次尝试单击按钮时,顶级不会闪烁并产生bell()效果。
from tkinter import *
from tkinter import messagebox



def dialog():  #  this function to call when entry doesn't match 
    tp = Toplevel(log)
    tp.geometry("300x100")
    tp.title('error')
    tp.grab_set()  # to bring the focus to the window for you to close it
    tp.resizable(width=False, height=False)
    l = Label(tp, text="try again\n\n\n\n add your customarize image to the window")
    l.pack()


def top():
    if entry1.get() == "333":
    log.destroy()
    root.deiconify()
else:
    dialog()  # being called here 


root = Tk()
root.geometry("300x300")

log = Toplevel(root)
log.geometry("200x200")


label1 = Label(log, text="password")
entry1 = Entry(log)
button1 = Button(log, text="login", command=top)

label1.pack()
entry1.pack()
button1.pack(side="bottom")

lab = Label(root, text="welcome bro").pack()


root.withdraw()

root.mainloop()