Python Tkinter快速对话框开始/结束错误

Python Tkinter快速对话框开始/结束错误,python,tkinter,widget,Python,Tkinter,Widget,考虑这个问题末尾的示例,它是一个准备运行的Python 3程序: 不管怎样,这有个问题。也就是说,如果您连续快速按关联菜单键和退出键,键盘最终将锁定。鼠标点击仍然有效。唯一的解决办法似乎是关闭程序并重新启动它 这看起来可能是一个非常罕见的bug,但实际上您不必总是按这么多键来引起bug。有时,只需按一到三次按钮,它就会锁定。你打开和关闭它的速度有多快似乎关系重大。如果您小心地按下一个按钮,等待片刻,然后按下另一个按钮,您可能永远不会遇到错误 这似乎仍然是一个相当小的问题,因为人们可能永远都不想快

考虑这个问题末尾的示例,它是一个准备运行的Python 3程序:

不管怎样,这有个问题。也就是说,如果您连续快速按关联菜单键和退出键,键盘最终将锁定。鼠标点击仍然有效。唯一的解决办法似乎是关闭程序并重新启动它

这看起来可能是一个非常罕见的bug,但实际上您不必总是按这么多键来引起bug。有时,只需按一到三次按钮,它就会锁定。你打开和关闭它的速度有多快似乎关系重大。如果您小心地按下一个按钮,等待片刻,然后按下另一个按钮,您可能永远不会遇到错误

这似乎仍然是一个相当小的问题,因为人们可能永远都不想快速打开和关闭它。然而,这只是产生问题的简单例子。这不是我想要修复它的原因

在我的实际程序文本编辑器中,您可以按菜单按钮;这不是唯一的用例,弹出一个对话框,你输入一些东西,它会向文本编辑器输出一些特殊的东西。它有点像一个非常强大的Linux组合键。我不想卷入其中。你只要相信我,它在各种用途上都非常有用

不管怎么说,问题是如果人们连续快速输入代码,在极少数情况下,键盘会锁定,就像您交替按下下面示例代码中的escape和menu按钮一样。输入成功代码时,将调用end_dialog方法。因此,下面的代码只是在复制问题,而没有所有的功能

所以,我的问题是,是什么导致了这个错误?代码有问题吗?这只是我的系统吗?我怀疑我的显卡驱动程序可能是罪魁祸首,而不是我的代码或Tkinter。因此,如果您尝试了很长一段时间,仍然无法复制错误,请告诉我

无论如何,我使用的是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;

我不知道这是否是问题所在,但我建议将对mainloop的调用移出构造函数。有了它,这个对象就永远不会被完全构造。谢谢你的评论。我只是尝试在e=Editor;,之后将main循环移到类外;,但是问题仍然存在。如果我将对话框和结束对话框方法快速连续地放在一个循环中很多次,它不会导致问题。所以,只要它们一个接一个地直接执行,它似乎不会引起问题,但是,它不会显示视觉,或者我看不到任何打开和关闭一千次的东西,或者其他什么,视觉方面可能在其中起着关键作用。如果使用多个线程,可能会导致类似的问题。因此,我想知道是否有一些代码在mainloop或其他程序中的窗口之间意外地不线程安全。我必须测试这是否只发生在顶级小部件上。另外,我在mainloop中添加了对上述代码的更改。Tkinter不是线程安全的,并且不使用线程本身。您的程序不使用线程,因此它肯定与线程无关。