如何新建一个window之类的消息框?

How to create a new window like a message box?

大家好,希望你们一切顺利,我不明白如何在 Tkinter 中创建一个新的 window 例如,当我按下一个类似于消息框的按钮时,我的意思是创建一个新的 window 并且我无法返回 previous/main window,直到我关闭或在新的 window 中按确定。如何简单地创建一个新的 window 并且用户不能单击主 window 并且在他关闭它之前不能离开,就像在消息框中发生的一样?谢谢!这是一个基本的起始代码,如何将我正在谈论的 window 绑定到按钮?

from tkinter import *
window = Tk()
window.geometry("300x300")
button = Button(window,text="Click here")
button.pack()
window.mainloop()

这种控制应用程序的对话框称为“模态对话框”。可以使用grab_set方法实现。

from tkinter import *

def new_window():
    def close_window():
        dialog.grab_release()
        dialog.destroy()
    dialog = Toplevel(window)
    close = Button(dialog,text="close",command=close_window)
    close.pack()
    dialog.grab_set()
    

window = Tk()
window.geometry("300x300")
button = Button(window,text="Click here",command=new_window)
button.pack()
window.mainloop()

当您按下“单击此处”时,此代码会创建一个新的顶层 window。该对话框将抓取当前应用程序的所有事件,直到您单击将释放抓取的关闭按钮。

编辑

正如@scotty3785 上面提到的,您可以使用 grab_set() 方法将焦点保持在顶层 window。但是根 window 仍然是可拖动的。但是阅读文档,我遇到了 grab_set_global() 方法。

w.grab_set_global() Widget w grabs all events for the entire screen. This is considered impolite and should be used only in great need. Any other grab in force goes away.

参考:Universal widget methods

虽然这被认为是不礼貌的,但它确实达到了您在这里想要达到的目的。确保也将焦点设置在顶层 window:

import tkinter as tk

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

def show_message():
    dialog = tk.Toplevel(root)

    close = tk.Button(dialog,text="close",command=dialog.destroy)
    close.pack()

    dialog.focus_set()
    dialog.grab_set_global()

button = tk.Button(root,text="Click here", command=show_message)
button.pack()

root.mainloop()

替代解决方案

Tkinter 的 messagebox 小部件可以完成您在这里想要实现的目标。当消息框可见时,您将无法关注根 window.

参考

例子

import tkinter as tk
from tkinter import messagebox as mb

root = tk.Tk()

def dialog(*args):
    mb.showinfo("Dialog", "Hello World!")

btn = tk.Button(root, text="Click me", command=dialog)
btn.pack()

root.mainloop()