Python Tkinter messagebox在解雇后重新出现

Python Tkinter messagebox在解雇后重新出现,python,macos,tkinter,Python,Macos,Tkinter,我正在使用Tkinter 8.6和macOS 10.15.4 下面的代码给出了一个按钮,弹出一个消息框,可以将其取消: import tkinter as tk from tkinter import messagebox root = tk.Tk() button = tk.Button(root, text = 'click here', command = messagebox.askquestion) button.pack() root.mainloop() 解除messagebo

我正在使用Tkinter 8.6和macOS 10.15.4

下面的代码给出了一个按钮,弹出一个消息框,可以将其取消:

import tkinter as tk
from tkinter import messagebox

root = tk.Tk()
button = tk.Button(root, text = 'click here', command = messagebox.askquestion)
button.pack()
root.mainloop()
解除messagebox后,如果我将焦点更改为另一个窗口,然后使用command tab将焦点更改回tk窗口,则解除的messagebox将重新出现,但无法与之交互。如果我用鼠标将焦点更改回tk窗口,则不会发生这种情况。如果我再次单击该按钮,ghost messagebox将消失,并显示一个新的

这里有一个短片。
大约9秒时,我的命令选项卡离开tkinter窗口,10秒时,命令选项卡返回。您可以看到,ghost messagebox可以移动,但不能解除。

这是mac上Tkinter的一个已知问题,非常烦人。我们可以通过使用
root.grab\u set()
并使用
root.grab\u release()
将焦点放回窗口来解决此问题

现在,您可以做的是像这样创建一个函数
askquestion()

def askquestion(title=None,message=None,**选项):
r=messagebox.askquestion(标题、消息、**选项)
tk.\u默认值\u根目录.grab\u集()
tk.\u default\u root.grab\u release()
返回r
当您只想使用
askquestion
messagebox
时,这将很好地工作,但如果您想使用其他消息框,则必须为每个不同的消息框创建一个新函数。因此,在我看来,如果您只是修改
messagebox.Message()
class
show()
方法,那么它将为所有人带来好处。这样,

将tkinter作为tk导入
从tkinter导入消息框
类消息(messagebox.Message):
def显示(自我,**选项):
r=super().show(**选项)
tk.\u默认值\u根目录.grab\u集()
tk.\u default\u root.grab\u release()
返回r
messagebox.Message=Message

这就是你需要在代码开头写的全部内容。希望这能解决你的问题

换个角度思考<代码>;它在windows上运行良好。你能在你的问题中放一个简短的片段来展示这种奇怪的行为吗?谢谢@制造商补充道