Tkinter tkMessageBox禁用Tkinter键绑定

时间:2018-02-26 07:30:07

标签: 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()

如果我按原样运行代码完全,程序将在 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 继续工作。

1 个答案:

答案 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版本已经足够老了仍然可以使用该错误。