Python 相当于时间。睡眠?

Python 相当于时间。睡眠?,python,pyqt,pyqt4,Python,Pyqt,Pyqt4,我不能在pyqt应用程序中使用time.sleep,因为这会冻结GUI线程,因此在此期间GUI将完全冻结。我一直在寻找一种方法来处理此问题 我试图使用QTimer,但似乎它们需要链接到另一个函数?比如等待10秒钟,然后运行一些函数。有没有办法让它先等待,然后继续使用当前函数 def num(self): for i in range(1,999): print i #Add some sleep here def testSleep(self):

我不能在pyqt应用程序中使用time.sleep,因为这会冻结GUI线程,因此在此期间GUI将完全冻结。我一直在寻找一种方法来处理此问题

我试图使用QTimer,但似乎它们需要链接到另一个函数?比如等待10秒钟,然后运行一些函数。有没有办法让它先等待,然后继续使用当前函数

def num(self):
    for i in range(1,999):
        print i
        #Add some sleep here

def testSleep(self):
    QtCore.QTimer.singleShot(2000, self.num)

也许可以做得更好,但您可以始终使用
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_())
导入系统 从PyQt4导入QtGui、QtCore #def num(self,i): 定义编号(i): 打印i i+=1 如果i<999: #使用参数在2000毫秒后再次运行 QtCore.QTimer.singleShot(2000,lambda:num(i)) #QtCore.QTimer.singleShot(2000,lambda:self.num(i)) app=QtGui.QApplication(sys.argv) #第一次使用start参数运行 数字(1) #QtCore.QTimer.singleShot(2000,lambda:num(1)) sys.exit(app.exec_())
您不能在pyqt主事件循环中使用
time.sleep
,因为它会停止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_())
导入系统 从PyQt4导入QtGui、QtCore application=QtGui.QApplication(sys.argv) i=0 计时器=QtCore.QTimer() def num(): 全局定时器
如果我我相信您是在问如果num()需要几秒钟才能运行,如何保持GUI的响应性?您有两个选择:

  • 如果
    num()
    由许多小块的“工作”组成,您可以在这些小块之间调用
    application.processEvents()
    ,这将允许GUI响应事件。一种很容易处理的情况是,大部分
    num()
    时间都花在循环中,然后在每次迭代的开始或结束时,调用
    application.processEvents()
    。在实际应用程序中,如果您无权访问
    应用程序
    ,请从PyQt4导入
    qApp
  • 更好的方法是在单独的线程中执行
    num()。有很多这样的例子。一种方法是

    • 实例化一个
      QThread
    • 定义一个类(比如说
      NumberCruncher
      ),该类派生自
      QObject
      ,定义
      num(self)
      ,并定义返回前由
      num()
      发出的信号“完成”
    • 调用
      numberCruncher.moveToThread(线程)
    • 将线程
      started
      信号连接到
      num
    • 开线

实际上,我在寻找time.sleep替代品,以便在pyqt中使用,而不使用任何线程概念

我想出的解决办法是:

from PyQt4 import QtTest

QtTest.QTest.qWait(msecs)
这与time.sleep的工作原理类似,使GUI具有响应性


感谢您的回答。

另一种选择是在等待时处理Qt事件:

def num():
对于范围(1999)内的i:
印刷品(一)
#总共睡五秒钟
对于范围内的(5*10):
#处理短睡眠时间之间的事件
qtwidts.QApplication.processEvents()
睡眠时间(0.1)

将当前函数拆分为两个函数,并使用
QTimer
再次执行该函数,并再次查看文档-它有方法
singleShot()
最好添加小的,有问题的工作示例-它将更具可读性,每个人都可以运行它并查看您的问题。至于我,您应该使用
QTimer
而不是
for loop
,类似于
if run\u:singleShot(2000,self.num)
实际上num()函数,我在这里介绍的函数在内部导入多个脚本,因此,在基于响应的每个不同脚本中,需要添加适当的睡眠时间。这让鬼挂了起来。甚至我也不能在这里实现线程概念,因为它涉及许多代码更改。所以我尝试在Pyqt中使用睡眠替代方案。您需要在测试套件或应用程序中使用此选项吗?它用于应用程序。然后使用QtTest是不合适的,它用于单元测试。另外,如果可以通过QtTset完成,那么可以直接在PyQt中完成。如果您需要在不阻塞GUI的情况下等待一段时间(在尝试某项操作之前),请使用
QTimer.singleShot()
。您的回答意味着高级PyQt用户的其他三个答案都不充分,这意味着您的问题没有明确说明。你要么澄清它,要么,如果你做不到,就把它移除。这个解决方案对我来说非常有效,不管它是否适合使用。我只需要一个简单的睡眠,没有比这更复杂的了。如果PyQt中缺少这一点(测试除外),那么我宁愿使用它,也不愿实现任何比需要更复杂的东西。