tk destroy()和grid_forget()并不总是有效

时间:2012-08-22 16:54:21

标签: python windows tkinter

我希望有人能在这里帮助我。我正在建立一个tkinter gui的问题。这个问题只发生在Windows中。我的GUI创建了一个结果框,其中包含一些标签,当计算其他内容时,用户点击“newPort”按钮,该按钮应该删除结果框并设置为False一些实例属性内部的计算。我遇到的问题,仅在Windows中才会显现,有时结果frame及其后代labels不会每次都消失。有时他们这样做,有时他们没有。实例变量已正确设置为False,但小部件仍在主GUI上可见。 GUI还包含一对checkboxesradiobuttons,但它们不会影响结果框架的创建,也不会影响其预期的破坏。在点击newPort按钮导致framelabels不被破坏之前,我无法确定用户采取的操作模式。当我用py2exe冻结我的应用程序,以及从eclipse IDE中的python解释器运行应用程序时,会发生这种情况。我没有尝试直接从python解释器运行应用程序(即没有IDE),当我使用eclipse python解释器运行应用程序时,我的Mac上不会发生这个问题。非常感谢!我的代码如下所示:

import Tkinter as TK
class widget(object):
    def __init__(self,parent=None):
        self.parent = TK.Frame(parent)
        self.parent.grid()
        self.frame = TK.Frame(self.parent)
        self.frame.grid()
        newLedger = TK.Button(self.parent,command=self.newPort).grid()
        self.calcButton = TK.Button(self.frame,command=self.showResults)
        self.calcButton.grid()
        self.calcVariable = True
    def newPort(self):
        self.calcVariable = False
        try:
            self.second.grid_forget()
            self.first.grid_forget()
            self.resultsFrame.grid_forget()
            self.second.destroy()
            self.first.destroy()
            self.resultsFrame.destroy()
        except:
            raise
        self.frame.update_idletasks()
    def showResults(self):
        self.resultsFrame = TK.Frame(self.frame)
        self.resultsFrame.grid()
        self.first = TK.Label(self.resultsFrame,text='first')
        self.first.grid()
        self.second = TK.Label(self.resultsFrame,text='second')
        self.second.grid()
if __name__ == '__main__':
    root = TK.Tk()
    obj = widget(root)
    root.mainloop()

1 个答案:

答案 0 :(得分:1)

您不需要在标签上销毁或致电grid_forget,也不需要在resultsFrame上调用grid_forget;当你破坏resultsFrame时,它将导致所有关闭它的子节点,并且当这些小部件被销毁时,它们将不再由网格管理。

我可以让小部件不被破坏的唯一方法是点击" calc"按钮连续两次而不点击"新"中间的按钮。我是通过从命令行运行程序来做到这一点的。