Py学习  »  Python

如何使用pyqt5 python[duplicate]在测验应用程序中显示计时器

Javeria Hassan • 3 年前 • 1768 次点击  

我不能利用时间。在我的pyqt应用程序中睡眠,因为这会冻结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)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/129115
文章 [ 5 ]  |  最新文章 3 年前
ImportanceOfBeingErnest
Reply   •   1 楼
ImportanceOfBeingErnest    8 年前

你不能使用 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_())
Community Nathan Fellman
Reply   •   2 楼
Community Nathan Fellman    8 年前

我相信您是在问,如果num()需要几秒钟才能运行,如何保持GUI的响应性?你有两个选择:

  • 如果 num() 由许多小块的“工作”组成,你可以称之为 application.processEvents() 在块之间,这将允许GUI响应事件。一个容易处理的情况是 num() 在循环中花费时间,然后在每次迭代的开始或结束时调用 应用processEvents() .在您的实际应用程序中,如果您无法访问 application 进口 qApp 来自PyQt4。
  • 更好的方法是执行 num() 在另一个线程中。有很多这样的例子(比如 this one ).一种方法是

    • 例举一个例子 QThread ,
    • 定义一个类(比如 NumberCruncher )这源于 QObject 并定义 num(self) 并定义由 num() 回来之前
    • 呼叫 numberCruncher.moveToThread(thread)
    • 连接线 started 向…发出信号 num
    • 启动线程
ababak
Reply   •   3 楼
ababak    4 年前

另一种选择是在等待时处理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)
furas
Reply   •   4 楼
furas    8 年前

也许可以做得更好,但你可以随时使用 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_())
eyllanesc PAR
Reply   •   5 楼
eyllanesc PAR    8 年前

其实我在找时间。在pyqt中使用睡眠替代方案,而不使用任何线程概念。

我想出的解决办法是:

from PyQt4 import QtTest

QtTest.QTest.qWait(msecs)

这类似于时间。睡眠使GUI反应灵敏。

谢谢你的回答。