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

时间:2012-10-12 18:56:34

标签: python tkinter messagebox

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

messagebox.askyesno("text", "question?")

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

messagebox.askyesno("text", "question?")
messagebox.askyesno("text", "question?")

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

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

1 个答案:

答案 0 :(得分:0)

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