我正在尝试使用Python和PyGTK编写一个WiFi管理界面。
用户在 gtk.TreeView
中看到可用网络的列表。然后,她/他可以选择通过单击按钮重新扫描无线网络。无论出于何种原因,重新扫描过程确实很快。事实上,速度如此之快,以至于点击按钮时感觉什么也没有发生,尽管网络列表确实正在重新扫描。
我想要做的是添加几秒钟的延迟,其中界面会阻塞并显示一个 gtk.Spinner
以便用户看到我用来显示网络列表的 gtk.TreeView 已被清除并重新填充。
显然,time.sleep()
不是正确的方法。有没有一种优雅的方法来做到这一点?
最佳答案
关于 LOC,我能想到的最短答案:
from threading import Thread
import gobject
gobject.threads_init()
time_to_wait = 2.0 # time in seconds
nonblocking_wait = Thread(target=sleep, args=(timetowait,))
nonblocking_wait.start()
while nonblocking_wait.is_alive():
nonblocking_wait.join(.05)
gtk.main_iteration_do(True) # blocks if no event is pending
再看一眼,我意识到,对于某些读者来说, sleep 线程的相关性可能很模糊。其目的是建立 time_to_wait
+ 0.05
秒(+ 开销)的最大时间限制!您可以使用计数器或类似的方法来完成此操作,但这样可以防止空闲循环中 CPU 上的无用负载。
这样 gtk 仍然可以处理绘制更新。
任何进度条更新或任何内容都必须放入 while 循环中。
关于python - 在 PyGTK 中获取要阻止的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20540244/