相当于 PyQt 应用程序的 time.sleep

2024-12-25 08:51:00
admin
原创
169
摘要:问题描述:我无法在我的 pyqt 应用程序中使用 time.sleep,因为这会冻结 GUI 线程,因此 GUI 在此期间将完全冻结。我一直在寻找处理这个问题的方法。我尝试使用 QTimer,但似乎需要将它们链接到另一个函数?比如等待十秒钟然后运行某个函数。有没有办法让它等待然后继续执行当前函数?def nu...

问题描述:

我无法在我的 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`
+ 启动线程
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3983  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2747  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   82  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   90  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   79  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用