如何用tkinter清除窗口

时间:2015-01-19 05:48:43

标签: python tkinter destroy

假设我有一个充满tkinter小部件的可爱窗口,所有小部件都设置了一个功能。这些小部件中的一个是按钮。按下此按钮后,我想转到下一个屏幕'。下一个屏幕是另一个功能(包括我想要在该屏幕上显示的所有小部件)。我试图简单地从按钮运行下一个程序,但是如果它确实运行,它只会将小部件添加到现有窗口,最终你会将屏幕#1和屏幕#2混在一起。我有一种感觉,我需要使用destroy,但我不知道怎么做,因为我能想到的唯一方法是将窗口1中的所有小部件组合在一起,然后销毁它,但是我无法从函数#2中获取销毁框架,因为它只是在函数/窗口#1中的变量。很抱歉,如果这令人困惑,另一个选项是来源,但是有大量的小部件和正在进行的其他窗口让我相信会更加混乱。

2 个答案:

答案 0 :(得分:2)

最简单的方法是让您的函数创建一个单独的框架,然后将所有小部件放在该框架中。然后可以将框架放置在主窗口中,使其填满整个窗口。然后,要删除所有内容,只需删除一帧。

转向下一个屏幕的另一种方式"是使用相同的方法,但提前创建所有帧。您可以将这些框架叠加在一起,并使用lift和/或lower来确定哪一个在顶部。顶部的那个会掩盖下面的那些。

有关堆叠的示例,请参阅Switch between two frames in tkinter

至于frame2不知道如何销毁frame1的问题,你只需要在创建一个新帧时传入对现有帧的引用,或者传入对一个" controller" - 一个了解所有帧的函数。然后,您要求控制器删除当前帧,控制器将知道当前帧是什么。

答案 1 :(得分:-1)

一个调用功能的按钮,删除所有现有帧并重建另一个听起来像设计缺陷的声音。错误的倾向(忘记删除代码某些地方的某些元素等)非常大。

如果你没有疯狂数量的UI元素,我建议一次创建它们,并根据需要隐藏/显示各种元素。

看一下this SO answer,了解如何创建可显示/隐藏的GUI元素,以及回调函数的外观。

编辑:如果您确实需要根据这些功能进行操作,那么我想其他方法可能就是这样:

说' top_frame'是包含您在运行函数#2时要销毁的所有小部件的框架。更改函数#1中的所有GUI元素,以便在创建它们时,显式传递它们top_frame,以便它们具有指向它的链接(self.top_frame = top_frame)。这意味着您的按钮也会有一个属性self.top_frame。您将其作为函数#2的参数之一传递,函数#2现在可以引用top_frame并将其销毁。

但是由于GUI元素的所有创建/破坏,肯定容易出错并且可能更慢。如果你有时间,我建议你仔细阅读上面答案中的代码,这确实是一个更好的解决方案。

相关问题