因此,在我的应用程序中,我创建了一个QtCore.QTimer
对象,然后在该对象上调用singleShot
方法以在60秒后调用一个函数。现在,在任何给定时间点,如果我需要再次在其上调用singleShot
方法,并阻止先前的singleShot
方法生效(即阻止它调用传递给它的调用者,如果第二次singleShot
是在前60秒之前调用),我该怎么办?如何才能“杀死”以前的QTimer
并完全忘记它,而只能使用当前的QTimer
?
有人可以帮我这个忙吗?
这只是一个示例代码:
def main():
q = QtCore.QTimer()
q.singleShot(4000, print_hello)
q.killTimer(id) ##how can I get the value of 'id' so that print_hello() is not called before the end of the 4 seconds?
def print_hello():
print 'hello'
谢谢
最佳答案
问题是QTimer.singleShot()
不返回对QTimer
的引用。无论如何,我不知道如何获取计时器ID,因此您可以使用该方法将其杀死。但是,您可以实例化一个正常的QTimer
并将其设置为单次计时器(这不是您在提供的代码中所做的事情,在singleShot
实例上调用QTimer
会创建一个新的 QTimer
,您无法访问它。 )
但是,一切并没有丢失。您可以创建一个普通的QTimer
,并使用setSingleShot(True)
将其转换为单次计时器。如果您希望中止计时器,则可以调用stop()
方法。请参阅下面的代码示例,该示例在3秒钟的超时时间内完成了您需要的工作。您可以连续快速按任意多次按钮,并在停止后3秒钟打印一次“hello”。如果按下一次,请等待4秒钟,然后再次按下,它当然会打印两次!
希望对您有所帮助!
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class MyApp(QWidget):
def __init__(self,*args,**kwargs):
QWidget.__init__(self,*args,**kwargs)
self.current_timer = None
self.layout = QVBoxLayout(self)
self.button = QPushButton('start timer')
self.button.clicked.connect(self.start_timer)
self.layout.addWidget(self.button)
def start_timer(self):
if self.current_timer:
self.current_timer.stop()
self.current_timer.deleteLater()
self.current_timer = QTimer()
self.current_timer.timeout.connect(self.print_hello)
self.current_timer.setSingleShot(True)
self.current_timer.start(3000)
def print_hello(self):
print 'hello'
# Create QApplication and QWidget
qapp = QApplication(sys.argv)
app = MyApp()
app.show()
qapp.exec_()
关于python - 如何在PyQt4中杀死QtCore.QTimer一枪?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21079941/