Tkinter消息框的行为不像模态对话框

use*_*446 5 python tkinter messagebox

我正在使用messagebox来解决一个简单的是/否问题,但是这个问题不应该被避免,所以我想让它不可避免,似乎我有一个问题框.

messagebox.askyesno("text", "question?")
Run Code Online (Sandbox Code Playgroud)

然后我可以回到tkinter的根窗口,问题仍然是等待响应,但如果我有

messagebox.askyesno("text", "question?")
messagebox.askyesno("text", "question?")
Run Code Online (Sandbox Code Playgroud)

打开第一个消息框后,我仍然可以回到tkinter的根窗口,但是我无法使用其他问题框(就像我需要的那样).这适用于我测试的每个消息框.任何人都可以解释我为什么会这样,我怎么能让第一个问题框不可避免,或者我只需要messagebox在我的实际问题框之前做空白.有什么我做错了,因为我认为消息框不应该关心它之前是否有消息框.

为了更好地说明我的观点,我开始组织一个简单的组织良好的例子,它完美地运作.我想出了差异,因为我messagebox第一次开始使用,我想测试它的功能,并没有把它放在一个函数中.在一个功能中,它完美地运作.

Ste*_*ers 1

用于grab_set使焦点远离 root,直到消息框得到答复。或者wait_window()打开消息框后拨打。只需要1个或另一个

import tkinter as tk
from tkinter.messagebox import askyesno

def onClick():
    root.grab_set() # Prevent clicking root while messagebox is open
    ans = askyesno('Confirm', 'Press Yes / No')
    root.wait_window() # Prevent clicking root while messagebox is open
    if ans:
        print('Yes Pressed')
    else:
        print('No Pressed')

root = tk.Tk()

tk.Button(root, text='Click me', command=onClick).pack()

root.mainloop()
Run Code Online (Sandbox Code Playgroud)