【问题标题】:Tkinter tkMessageBox disables Tkinter key bindingsTkinter tkMessageBox 禁用 Tkinter 键绑定
【发布时间】:2018-02-26 07:30:06
【问题描述】:

这是一个非常简单的例子:

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 继续工作。

【问题讨论】:

  • 你的注意力是否回到root窗口?
  • 这个问题似乎适用于我的所有键盘事件以及 python 3.7
  • 你的操作系统是什么?
  • @BryanOakley 我能够在 Windows 7 和 10 上重现该问题。
  • 是的,我应用了焦点,甚至重复了绑定。没有效果。我正在使用 Windows 7。

标签: python events tkinter keyboard-events messagebox


【解决方案1】:

如果我理解这个问题,如果你打电话给tkMessageBox.showInfo(),你会得到不好的行为打电话mainloop之前。如果是这样,我认为这是 Windows 上 tkinter 中的一个已知错误。

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

例如:

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

最初的错误是很久以前报告的,tk 错误数据库已经移动了一次或两次,所以我很难找到指向原始问题的链接。这是 2000/2001 年提到的一个问题:https://core.tcl.tk/tk/tktview?name=220431ffff(请参阅错误报告最底部的 cmets)。

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

【讨论】:

  • 正如我所说,通过按钮调用msg_test() 没有问题。但是您在tkMessageBox 之前使用root.update() 的建议是一个令人愉快的启示!它完美地适用于tkMessageBox(直接在主体中)的多种用途!谢谢。
猜你喜欢
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多