我如何在函数和类-tkinter中使用destroy?

时间:2019-12-21 19:21:15

标签: python oop tkinter destroy

我已经在类中看到self.destroy()的一些用法,但是我无法使其与我想要的功能配合使用。

我有resultsPage类,它显示在另一页上获得的结果。我制作了displayResults(pageNo)函数,以便在resultsPage可见时显示它们。问题是出现在结果页面之间的后退和下一步按钮。所有小部件都在彼此之上创建,但是我想将其全部删除,然后创建新的。我添加了self.destroy()来尝试解决此问题,但这没有用。

我不确定这与我定义函数的位置有关,但是我一直在玩弄它们的定义位置,并且它没有更改错误消息。

这是我的代码的简化示例:

class resultsPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

    def onShowFrame(self, event):
        def displayResults(pageNo):
            self.destroy()
            #Create widgets related to pageNo
            #Create back and next buttons e.g.
            back = tk.Button(self, text="<=",
                                 command=lambda: displayResults(pageNo - 1))
        displayResults(1)

我得到的错误是:_tkinter.TclError: bad window path name ".!frame.!previewresultspage"

如果有帮助,我可以发布完整的代码,但我想将其概括化,这样对其他人更有帮助。

2 个答案:

答案 0 :(得分:0)

您要删除onShowFrame中的小部件,然后立即尝试以其为父级创建一个新的小部件。您不能将已删除的小部件用作另一个小部件的父级。

答案 1 :(得分:0)

如前所述,在这种情况下使用self.destroy()将不起作用。为了达到删除框架上所有小部件的目的,您可以使用循环(记入@stovfl):

for widget in self.grid_slaves():
    widget.destroy()