Python Tkinter tkMessageBox禁用Tkinter密钥绑定

Python Tkinter tkMessageBox禁用Tkinter密钥绑定,python,events,tkinter,keyboard-events,messagebox,Python,Events,Tkinter,Keyboard Events,Messagebox,下面是一个非常简单的示例: from Tkinter import * import tkMessageBox def quit(event): exit() root = Tk() root.bind("<Escape>", quit) #tkMessageBox.showinfo("title", "message") root.mainloop() 通过单击按钮使用tkMessageBox,不会影响按键绑定,即按Esc键继续工作 如果我理解这个问题,那么如果在调用ma

下面是一个非常简单的示例:

from Tkinter import *
import tkMessageBox

def quit(event):
  exit()

root = Tk()
root.bind("<Escape>", quit)
#tkMessageBox.showinfo("title", "message")
root.mainloop()

通过单击按钮使用
tkMessageBox
,不会影响按键绑定,即按Esc键继续工作

如果我理解这个问题,那么如果在调用
mainloop
之前调用
tkMessageBox.showInfo()
,就会出现不良行为。如果是这样的话,我想这是windows上tkinter的一个已知错误

解决办法很简单:不要那样做。如果您需要在程序开始时显示对话框,请使用
after
将其安排在mainloop启动后显示,或在显示对话框之前调用
update

例如:

root = Tk()
root.after_idle(msg_test)
root.mainloop()

最初的bug是很久以前报告的,tk bug数据库已经移动了一两次,所以我很难找到与最初问题的链接。这里有一期2000/2001的文章提到了这一点:(见bug报告底部的评论)


该报告声称它已修复,但可能它再次出现,或者可能您的tkinter版本已经足够旧,仍然存在该漏洞

您是否将注意力重新集中到
root
窗口?这个问题似乎对我和python 3.7都适用所有键盘事件。您的操作系统是什么?@BryanOakley我能够在Windows 7和10上重现这个问题。是的,我应用了焦点,甚至重复了绑定。没有效果。我使用的是Windows 7。如我所说,通过按钮调用
msg_test()
没有问题。但是您建议在
tkMessageBox
之前使用
root.update()
,这是一个令人愉快的启示!它可以完美地使用
tkMessageBox
(直接在主体中)任意多个用途!谢谢
root = Tk()
root.after_idle(msg_test)
root.mainloop()