我无法在我的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)
答案 0 :(得分:6)
实际上我正在寻找time.sleep替代在pyqt中使用而不使用任何线程概念。
我想出的解决方案是:
from PyQt4 import QtTest
QtTest.QTest.qWait(msecs)
这类似于time.sleep使GUI响应。
谢谢你的回答。
答案 1 :(得分: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_())
答案 2 :(得分:2)
我相信如果num()需要几秒钟才能运行,你问如何保持GUI响应?您有两种选择:
num()
包含许多小块&#34; work&#34;,您可以在块之间调用application.processEvents()
,这将允许GUI响应事件。一个容易处理的情况是,当大部分num()
时间花费在循环中,然后在每次迭代的开始或结束时,调用application.processEvents()
。在您的实际应用中,如果您无法访问application
,请从PyQt4导入qApp
。更好的方法是在单独的线程中执行num()
。 SO上有很多例子(如this one)。一种方法是
QThread
,NumberCruncher
),该类派生自QObject
并定义num(self)
并定义一个信号&#39; done&#39;在返回之前由num()
发出numberCruncher.moveToThread(thread)
started
信号连接到num
答案 3 :(得分:1)
您不能在pyqt主事件循环中使用time.sleep
,因为它会阻止GUI事件循环响应。
使用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_())
答案 4 :(得分:0)
另一种选择是在等待时处理 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)