0

我希望任何人都可以在这里帮助我。我对我构建的 tkinter gui 有疑问。该问题仅发生在Windows中。我的 GUI 创建了一个带有一些标签的结果框架,当需要计算其他内容时,用户单击“newPort”按钮,该按钮应该删除结果框架并设置为False计算内部的一些实例属性。我遇到的问题(仅在 Windows 中很明显)有时结果frame及其后代labels不会每次都消失。有时他们会,有时他们不会。实例变量已正确设置为,False但小部件在主 GUI 上仍然可见。GUI 还包含几个checkboxesradiobuttons但它们不会影响结果框架的创建或预期的破坏。newPort在单击导致frameandlabels不会被破坏的按钮之前,我无法确定用户采取的操作模式。当我使用 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()
4

1 回答 1

1

您不需要销毁或调用grid_forget标签,也不需要调用grid_forgetresultsFrame;当您销毁 resultsFrame 时,它​​将导致其所有子项被销毁,并且当这些小部件被销毁时,它们将不再由网格管理。

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

于 2012-08-22T20:02:06.133 回答