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

Posted

技术标签:

【中文标题】如何强制关闭顶层窗口的消息框【英文标题】:How to compulsory close message box for Toplevel window 【发布时间】:2017-12-05 11:02:08 【问题描述】:

image for that 我这里有几行代码,它是登录系统,可以正常工作,但是当我提供错误密码而不关闭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()

【问题讨论】:

How to create a modal dialog in tkinter?的可能重复 我试过grab_set() 和wait_window() 没用。 如果您使用Toplevel() 构建自己的消息框,grab_set() 应该可以工作 - 请参阅Dialog Windows 顺便说一句:在 Linux 上,我无法多次单击 login 按钮 - 我必须关闭 messagebox。所以它可能取决于系统。 【参考方案1】:

您需要将日志窗口设为对话框的父级:

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

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

【讨论】:

当我再次单击根窗口时,它会使窗口冻结,除非我在再次运行之前用任务管理器关闭它 我的答案是针对您发布的代码,您无法单击根窗口,因为它已被撤回。 这个答案可能是使用 Windows 7 的操作系统因素【参考方案2】:

来自@furas 的提示如何实现:

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

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()

【讨论】:

当您多次尝试单击按钮时,顶层不会闪烁并具有 bell() 效果。

以上是关于如何强制关闭顶层窗口的消息框的主要内容,如果未能解决你的问题,请参考以下文章

python用tkinter做一个最近很火的强制表白神器

javaSwing 关闭窗口,弹出消息框,无论我点击是,否 都关闭窗口,见代码!

c++单文档如何在点关闭按钮时出现提示框,必须是在窗口关闭前出现

在双显示器方案中将自动关闭消息框置于应用程序窗口的中心

如何在 MS ACCESS 中打开定时消息框而不创建其他窗口

qt弹出消息框程序继续运行