考虑这个问题结束的例子(它是一个可立即运行的Python 3程序):
无论如何,它存在问题。也就是说,如果快速连续按下上下文菜单键和转义键,键盘最终会锁定。鼠标点击仍然有效。唯一的解决方案似乎是关闭程序并重新启动它。
这可能看起来像是一个非常罕见的错误,但实际上你并不总是要按它们来引发这个错误。有时候,只需按下一到三个按钮,它就会锁定。你打开和关闭它的速度似乎很重要。如果你小心按一个,等一下,再按另一个,你可能永远不会遇到这个错误。
这似乎仍然是一个非常小的问题,因为人们可能不想快速打开和关闭它。但是,这只是产生问题的简单例子。我不想修理它。
在我的实际程序(文本编辑器)中,按下菜单按钮(例如,那不是唯一的用例),弹出一个对话框,输入一些内容,然后输出特殊内容到文本编辑器。它有点像一个非常强大的Linux组合密钥。我不想进入它。你必须相信我,它对各种目的都非常有用。
无论如何,问题是如果人们快速连续输入代码,在极少数情况下,键盘锁定,就像你在下面的示例代码中交替按下转义和菜单按钮一样。输入成功代码时会调用end_dialog方法。所以,下面的代码是复制问题(只是没有所有功能)。
所以,我的问题是,是什么导致了这个错误?代码有问题吗?这只是我的系统吗?我怀疑我的视频卡驱动程序可能是罪魁祸首,而不是我的代码或Tkinter。所以,如果你尝试了一段时间,但仍然无法复制这个bug,请告诉我。
无论如何,我使用Xubuntu 14.04,32位(Python 3.4.0)。
from tkinter import *;
class Editor:
def __init__(self):
self.ckd=None;
self.tk=Tk();
self.frame=Frame(self.tk);
self.text=Text(self.frame);
self.text.bind("<Menu>", self.my_dialog);
self.text.pack();
self.frame.pack();
self.tk.attributes('-zoomed', True);
self.text.focus_set();
def end_dialog(self, event):
self.text.focus_set();
self.ckd.destroy();
self.ckd=None;
return "break";
def my_dialog(self, event):
if self.ckd==None:
self.ckd=Toplevel(self.tk, height=100, width=200);
self.ckd.bind("<Escape>", self.end_dialog);
else:
#If it is already there, bring it into focus.
self.ckd.lift();
self.text.focus_set();
return "break";
e=Editor();
e.tk.mainloop();
try:
e.tk.destroy();
except:
pass;