相当于 PyQt 应用程序的 time.sleep
- 2024-12-25 08:51:00
- admin 原创
- 168
问题描述:
我无法在我的 pyqt 应用程序中使用 time.sleep,因为这会冻结 GUI 线程,因此 GUI 在此期间将完全冻结。我一直在寻找处理这个问题的方法。
我尝试使用 QTimer,但似乎需要将它们链接到另一个函数?比如等待十秒钟然后运行某个函数。有没有办法让它等待然后继续执行当前函数?
def num(self):
for i in range(1,999):
print i
#Add some sleep here
def testSleep(self):
QtCore.QTimer.singleShot(2000, self.num)
解决方案 1:
实际上,我正在寻找在 pyqt 中使用的 time.sleep 替代品,而不使用任何线程概念。
我想到的解决方案是:
from PyQt4 import QtTest
QtTest.QTest.qWait(msecs)
这与 time.sleep 类似,使 GUI 响应。
谢谢你的回答。
解决方案 2:
也许可以做得更好,但您始终可以使用singleShot
延迟运行函数,并lambda
使用参数运行函数。
import sys
from PyQt4 import QtGui, QtCore
#def num(self, i):
def num(i):
print i
i += 1
if i < 999:
# run again after 2000ms with argument
QtCore.QTimer.singleShot(2000, lambda:num(i))
#QtCore.QTimer.singleShot(2000, lambda:self.num(i))
app = QtGui.QApplication(sys.argv)
# run first time with start argument
num(1)
#QtCore.QTimer.singleShot(2000, lambda:num(1))
sys.exit(app.exec_())
解决方案 3:
另一种选择是在等待时处理 Qt 事件:
def num():
for i in range(1, 999):
print(i)
# Sleep five seconds in total
for _ in range(5 * 10):
# Process events between short sleep periods
QtWidgets.QApplication.processEvents()
time.sleep(0.1)
解决方案 4:
您不能time.sleep
在 pyqt 主事件循环中使用它,因为它会阻止 GUI 事件循环响应。
pyqt 中的解决方案可能如下所示,使用QTimer
import sys
from PyQt4 import QtGui, QtCore
application = QtGui.QApplication(sys.argv)
i=0
timer = QtCore.QTimer()
def num():
global i, timer
if i <999:
print ( i )
i += 1
else:
timer.stop()
timer.timeout.connect(num)
timer.start(2000)
sys.exit(application.exec_())
解决方案 5:
我相信您问的是,如果 num() 需要几秒钟才能运行,如何保持 GUI 响应?您有两个选择:
如果
num()
由许多小块“工作”组成,您可以application.processEvents()
在块之间调用,这将允许 GUI 响应事件。一种容易处理的情况是,当大部分时间都num()
花在循环中时,然后在每次迭代的开始或结束时调用application.processEvents()
。在您的实际应用程序中,如果您无法访问,请从 PyQt4application
导入。qApp
更好的方法是
num()
在单独的线程中执行。SO 上有很多这样的例子(比如这个)。一种方法是
+ 实例化一个`QThread`,
+ 定义一个`NumberCruncher`派生自的类(比如) ,并`QObject`定义在返回之前`num(self)`发出一个“done”信号`num()`
+ 称呼`numberCruncher.moveToThread(thread)`
+ 将线程`started`信号连接到`num`
+ 启动线程
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD