当前位置: 首页 > 知识库问答 >
问题:

Python Tkinter,在函数之后销毁顶级

郁烨
2023-03-14

我正在使用Tkinter作为GUI用python编程一些驱动器。当我的机器运行时,我想向用户显示一个顶层窗口,其中包含一些信息,这些信息应该在功能完成后自动关闭。这是我最小的例子:

from Tkinter import *
import time


def button_1():
     window = Toplevel()
     window.title("info")
     msg = Message(window, text='running...', width=200)
     msg.pack()     
     time.sleep(5.0)
     window.destroy()

master = Tk()
frame = Frame(width=500,height=300)
frame.grid()
button_one = Button(frame, text ="Button 1", command = button_1)
button_one.grid(row = 0, column = 0, sticky = W + E)
mainloop()

主要问题是,顶层窗口在5秒结束后才出现。有什么建议吗?谢谢!

共有2个答案

谭敏学
2023-03-14

一般的经验法则是,永远不要在运行GUI的线程中调用睡眠。原因是睡眠完全按照它说的做,它让整个程序进入睡眠状态。这意味着它无法刷新窗口或对任何事件做出反应。

如果您想在一段时间后做某事,正确的方法是在之后使用。例如,这将在五秒钟后破坏窗口:

window.after(5000, window.destroy)

农飞翔
2023-03-14

time.sleep(5)在GUI有时间更新之前启动,这就是为什么顶层只在5秒结束后出现。为了纠正这一点,您可以在之前添加window.update_idletasks()time.sleep(5)来强制更新显示。

但是,正如Bryan Oakley在他的回答中指出的那样,GUI在时间时被冻结。执行睡眠(5)。我猜您的最终目标不是执行时间。睡眠但需要一些耗时的操作。因此,如果您不想冻结GUI,但不知道执行需要多长时间,可以在单独的线程中执行函数,并定期使用after检查函数是否完成:

import Tkinter as tk
import time
import multiprocessing

def function():
    time.sleep(5)


def button_1():
    window = tk.Toplevel(master)
    window.title("info")
    msg = tk.Message(window, text='running...', width=200)
    msg.pack()
    thread = multiprocessing.Process(target=function)
    thread.start()
    window.after(1000, check_if_running, thread, window)


def check_if_running(thread, window):
    """Check every second if the function is finished."""
    if thread.is_alive():
        window.after(1000, check_if_running, thread, window)
    else:
        window.destroy()


master = tk.Tk()
frame = tk.Frame(width=500,height=300)
frame.grid()
button_one = tk.Button(frame, text ="Launch", command=button_1)
button_one.grid(row = 0, column = 0, sticky = "we")
master.mainloop()
 类似资料:
  • 销毁 Destroy 在不需要使用iScoll的时候调用iScroll实例的公共方法destroy()可以释放一些内存。 myScroll.destroy(); myScroll = null;

  • 问题内容: 我正在使用Cookies模块来设置cookie。这是我的代码: 但是在文档中,我还没有找到如何 销毁 该Cookie的方法。 任何建议,将不胜感激。 问题答案: 无法根据HTTP规范删除cookie。为了有效地“删除” cookie,您可以将过期日期设置为过去的某个日期。本质上,这将为您带来以下收益(根据Cookies模块文档): 或根据HTTP规范: 两者都应该起作用。您可以替换与一

  • 问题内容: 我在hapijs中使用jwt插件和策略。 我可以在登录用户时创建jwt令牌,并通过’jwt’策略使用同一令牌对其他API进行身份验证。 我将令牌设置为cookie,其中是令牌名称。另外,我没有将这些令牌保存在数据库中。 但是,注销时如何销毁jwt令牌? 请提出一种方法。 问题答案: JWT存储在浏览器中,因此删除令牌以删除客户端的cookie 如果您还需要在令牌到期之前从服务器端使令牌

  • 问题是在达到会话超时之前不会销毁会话范围的bean。 因此,对于以下注销程序,我有两个问题: 这是使用shiro注销的正确方法吗(请参阅下面的logout()) 注销期间销毁CDI会话范围bean的正确方法是什么。 page.xhtml: null 豆类: shiro.ini: 例外情况: 调用时引发以下异常 附加信息:我正在运行WildFly8.2.0.final。 多谢了。

  • 我有亲子活动。父活动将自定义状态存储在onSaveInstanceState中(super.onSaveInstanceState是在所有需要的项目打包到bundle中之后调用的),然后在onCread中读取状态,但是出于某种原因,SavedInstanceState总是为空。 以下是父活动的日志事件序列:onPause- 我对这个问题有点不清楚——请告诉我我可能错过了什么。 谢谢

  • 我有一个片段,它设置一个列表视图,并创建一个处理程序来定期更新列表视图。然而,看起来处理程序在片段被销毁后仍然运行。 以下是代码。 在被销毁后更新会导致应用程序崩溃。如何在被销毁时使停止?我还想知道如果应用程序的任何暂停对也有什么影响。