【问题标题】:Tkinter messagebox not behaving like a modal dialogTkinter 消息框的行为不像模态对话框
【发布时间】:2012-10-03 15:25:07
【问题描述】:

我将消息框用于一个简单的是/否问题,但不应回避该问题,因此我想让它不可避免,并且似乎我有一个问题框。

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

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

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

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

为了更好地说明我的观点,我开始整理一个简单且组织良好的示例,它运行良好。我弄清楚有什么不同,当我第一次开始使用messagebox时,我想测试它的能力,并没有把它放在一个函数中。在函数中它可以完美运行。

【问题讨论】:

  • tkinter.messagebox.askyesno 已经根据需要生成了一个模态对话框。
  • 对话框应该是模态的,因此查看更多代码以更好地理解上下文会很有用。
  • @J.F.Sebastian 我知道该对话框会生成一个模型对话框,但用户仍然可以忽略该问题并返回根窗口。例如,如果您尝试在 windows op 中保存一个文件并且您已经有一个同名的文件,您会收到无法避免的错误消息(开始发出哔哔声和其他东西)。这就是我想要的。如前所述,在第一个消息框被回答后,第二个消息框(以及第三个、第四个等等)会发生 excat 操作。
  • 您能否提供一个完整的最小示例来重现该问题?
  • @user1362446 您应该提供您的解决方案作为答案,并在允许后接受它(几天后)。

标签: python tkinter messagebox


【解决方案1】:

使用grab_set 将焦点从根目录移开,直到消息框得到答复。或者在打开消息框后拨打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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多