我正在使用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秒结束后才出现。有什么建议吗?谢谢!
一般的经验法则是,永远不要在运行GUI的线程中调用睡眠
。原因是睡眠完全按照它说的做,它让整个程序进入睡眠状态。这意味着它无法刷新窗口或对任何事件做出反应。
如果您想在一段时间后做某事,正确的方法是在之后使用。例如,这将在五秒钟后破坏窗口:
window.after(5000, window.destroy)
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- 我对这个问题有点不清楚——请告诉我我可能错过了什么。 谢谢
我有一个片段,它设置一个列表视图,并创建一个处理程序来定期更新列表视图。然而,看起来处理程序在片段被销毁后仍然运行。 以下是代码。 在被销毁后更新会导致应用程序崩溃。如何在被销毁时使停止?我还想知道如果应用程序的任何暂停对也有什么影响。