Python 相当于时间。睡眠?
我不能在pyqt应用程序中使用time.sleep,因为这会冻结GUI线程,因此在此期间GUI将完全冻结。我一直在寻找一种方法来处理此问题 我试图使用QTimer,但似乎它们需要链接到另一个函数?比如等待10秒钟,然后运行一些函数。有没有办法让它先等待,然后继续使用当前函数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):
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()
,这将允许GUI响应事件。一种很容易处理的情况是,大部分application.processEvents()
时间都花在循环中,然后在每次迭代的开始或结束时,调用num()
。在实际应用程序中,如果您无权访问application.processEvents()
,请从PyQt4导入应用程序
qApp
- 更好的方法是在单独的线程中执行
num()。有很多这样的例子。一种方法是
- 实例化一个
QThread
- 定义一个类(比如说
),该类派生自NumberCruncher
,定义QObject
,并定义返回前由num(self)
发出的信号“完成”num()
- 调用
numberCruncher.moveToThread(线程)
- 将线程
信号连接到started
num
- 开线
- 实例化一个
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中缺少这一点(测试除外),那么我宁愿使用它,也不愿实现任何比需要更复杂的东西。