【问题标题】:How to clear window with tkinter如何使用 tkinter 清除窗口
【发布时间】:2015-03-17 02:30:31
【问题描述】:

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

【问题讨论】:

    标签: python tkinter destroy


    【解决方案1】:

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

    “移动到下一个屏幕”的另一种方法是使用相同的方法,但提前创建所有帧。您可以将这些框架堆叠在一起,并使用lift 和/或lower 来确定哪个在顶部。上面的会遮住下面的。

    堆叠示例见Switch between two frames in tkinter

    至于frame2不知道怎么销毁frame1的问题,你只需要在新建frame的时候传入一个已有frame的引用,或者传入一个“controller”的引用——一个知道所有的帧。然后你要求控制器删除当前帧,控制器就会知道当前帧是什么。

    【讨论】:

    • 我知道这可能相当简单,但你能解释一下我是如何做第二部分的,关于传递参考和诸如此类的东西。假设我将 def SplashScreen 设为 #1,并且内部所有内容都在一个名为 totalFrame 的帧中。我也有 ActivationScreen,它应该跟在 splashScreen 之后,并且有一个称为 mainFrame 的框架。您能否大致描述一下 Id 与这些有什么关系才能使其运行?
    • @qwerty22:我链接到的问题向您展示了如何。它创建帧并传入一个“控制器”,它本身就是一个“控制器”。它知道所有的帧并且可以显示或删除它们。然后其他页面可以调用控制器的任何方法。,
    • 啊,好的,我将示例与第一位相关联,但不知何故没有建立连接。谢谢!
    • 所以我尝试将我的一个窗口复制到您提供的 samp 中,现在一切都适用于该给定窗口,除了没有图片加载(使用 PhotoImage(file=<file>)tk.Label(image=<image from previous>) 任何想法为什么会这样?尝试使用完整路径名和文件名。
    • 其实明白了,显然他们需要是全局的
    【解决方案2】:

    调用删除所有现有帧并重建另一个帧的函数的按钮听起来像是设计缺陷。出错的可能性很大(忘记删除代码某些地方的某些元素等)。

    如果您的 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 元素的所有创建/销毁,肯定容易出错并且可能更慢。我建议您有时间时仔细阅读上面答案中的代码,这确实是一个更好的解决方案。

    【讨论】:

    • 我知道我现有的方法存在缺陷和/或形式不佳。我没有什么经验,我正在寻找学习如何改进。该答案可能有一个可行的解决方案,但不幸的是,我没有将其适应我自己的工作所需的专业知识,因为有一些我什至不知道存在的功能和诸如此类的调用,无论哪种方式,我会继续努力,看看会发生什么
    • 删除一个框架并用另一个框架替换它是合理的做法,我不明白您为什么称其为设计缺陷。这与访问网站的不同部分真的没有什么不同。如果您要创建/销毁的所有小部件都在一个框架中,您只需删除并重新创建一个框架,该框架将负责删除其所有子级。
    • 嗯,通常我发现隐藏/显示 GUI 元素而不是删除/创建它们更容易推理,但我想这主要是在我隐藏/显示 GUI 的子部分的情况下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 2012-04-29
    相关资源
    最近更新 更多