如何用 tkinter 清除 window

How to clear window with tkinter

假设我有一个可爱的 window,里面装满了 tkinter 小部件,所有这些小部件都设置了一个函数。这些小部件中的一个是按钮。当这个按钮被按下时,我想要'move on to the next screen'。下一个屏幕在另一个功能中(包括我想在该屏幕上显示的所有小部件)。我试图简单地从按钮 运行 下一个过程,但如果它 运行 正确,它只会将小部件添加到现有的 window,你最终会得到两个屏幕# 1 和屏幕#2 混在一起。我觉得我需要使用销毁,但我不确定该怎么做,因为我能想到的唯一方法是将 window 1 中的所有小部件组合在一个框架中,然后销毁它,但我无法从函数 #2 中访问以销毁框架,因为它仅在 function/window #1 中是一个变量。抱歉,如果这令人困惑,另一个选项是来源,但是有大量的小部件和其他 windows 正在进行中,这让我相信那会更加混乱。

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

如果您没有大量的 UI 元素,我建议一次性创建所有元素,并根据需要创建 hiding/showing 各种元素。

查看 this SO answer,了解如何创建可以是 shown/hidden 的 GUI 个元素,以及回调函数的外观。

编辑:如果你真的需要基于这些功能来做,那么我想另一种方法可能是这样的:

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

但是由于 GUI 元素的所有 creation/destruction,肯定容易出错并且可能更慢。我建议您在有时间时查看上面答案中的代码,这确实是一个更好的解决方案。

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

"move on to the next screen" 的另一种方法是使用相同的方法,但要提前创建所有帧。您可以将这些帧堆叠在一起,并使用 lift and/or lower 来确定哪一个在最上面。上面的会遮住下面的。

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

关于frame2不知道如何销毁frame1的问题,只需要在创建新frame时传入对现有frame的引用,或者传入对a的引用"controller" - a知道所有帧的函数。然后你让控制器删除当前帧,控制器就会知道当前帧是什么