PyQt4等于time.sleep?

PAR*_*PAR 7 python pyqt pyqt4

我不能在我的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)
Run Code Online (Sandbox Code Playgroud)

PAR*_*PAR 7

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

我想出的解决方案是:

from PyQt4 import QtTest

QtTest.QTest.qWait(msecs)
Run Code Online (Sandbox Code Playgroud)

这类似于time.sleep使GUI响应.

谢谢您的回答.

  • 那么使用QtTest是不合适的,它是用于单元测试的。另外,如果可以通过 QtTset 完成,则可以直接在 PyQt 中完成。如果您需要等待一段时间(在尝试某些操作之前)而不阻塞 GUI,您可以使用“QTimer.singleShot()”。您的回答意味着高级 PyQt 用户的其他 3 个答案都不够充分,这意味着您的问题没有明确说明。您应该澄清它,或者如果您做不到,请将其删除。 (4认同)
  • 无论是否合适,这个解决方案对我来说都很完美.我只需要一个简单的睡眠,没有更复杂的.如果从PyQt中缺少(除了测试),那么我宁愿使用它而不是实现比必要更复杂的任何东西. (2认同)

fur*_*ras 6

也许它可以做得更好,但你总是可以使用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_())
Run Code Online (Sandbox Code Playgroud)