这是一个非常简单的例子:
from Tkinter import *
import tkMessageBox
def quit(event):
exit()
root = Tk()
root.bind("<Escape>", quit)
#tkMessageBox.showinfo("title", "message")
root.mainloop()
如果我按原样运行代码完全,程序将在 Esc 被命中时终止。现在,如果我取消注释tkMessageBox
行,则在关闭消息框后绑定将“丢失”,即按 Esc 将不再执行任何操作。这在Python 2.7中发生。你能否验证这件事是否也发生在你身上?让我知道你的Python版本。
这是一种“绕过”问题的方法。这是一种不同的方法,但它可能有所帮助:
from Tkinter import *
import tkMessageBox
def msg_test():
tkMessageBox.showinfo("title", "message")
def quit(event):
exit()
root = Tk()
root.bind("<Escape>", quit)
btn = Button(root, text="Check", command=msg_test); btn.pack()
root.mainloop()
通过单击按钮使用tkMessageBox
不会影响键绑定,即按 Esc 继续工作。
答案 0 :(得分:2)
如果我理解了这个问题,那么如果您在调用tkMessageBox.showInfo()
之前致电mainloop
,就会出现不良行为。如果是这样,我认为这是Windows上tkinter中的已知错误。
解决方案很简单:不要这样做。如果您需要在程序一开始时显示一个对话框,请使用after
将其安排在mainloop启动后显示,或在显示对话框之前调用update
。
例如:
root = Tk()
root.after_idle(msg_test)
root.mainloop()
很久以前就报告了原始的bug,并且tk bug数据库已经移动了一两次,因此我很难找到原始问题的链接。这是2000/2001年的一个问题,提到它:https://core.tcl.tk/tk/tktview?name=220431ffff(请参阅错误报告最底部的评论)。
该报告声称它已修复,但可能已经再次显示,或者您的tkinter版本已经足够老了仍然可以使用该错误。