因此,在我的应用程序中,我创建了一个QtCore.QTimer
对象,然后在其上调用singleShot
方法,在60秒后调用一个函数。现在,在任何给定的时间点,如果我需要再次调用singleShot
方法并阻止先前的singleShot
方法生效(这会阻止它调用传递给它的调用者) ,如果第二次在前60秒之前调用singleShot
,我该怎么办?我该怎样杀死'之前的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'
由于
答案 0 :(得分:12)
问题是QTimer.singleShot()
不会返回对QTimer
的引用。无论如何我都不知道获取Timer ID所以你可以使用该方法杀死它。但是,您可以实例化正常QTimer
并使其成为单次计时器(这不是您在提供的代码中所做的,在singleShot
的实例上调用QTimer
会创建一个您无权访问的新 QTimer
。)
然而,一切都不会丢失。您可以使用QTimer
创建普通setSingleShot(True)
并将其转换为单击计时器。如果您希望中止计时器,则可以调用stop()
方法。请参阅下面的代码示例,它会在3秒超时时执行您所需的操作。您可以快速连续按下按钮多次,并在停止后3秒打印“你好”。如果你按下一次,等待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_()
答案 1 :(得分:3)
以@three_pineapples's answer为基础,并简化代码。
无需在每次点击按钮时创建新QTimer
,您只需在现有计时器上调用.start()
,它就会停止并重新启动。
请参阅PyQt4 documentation for QTimer.start()
。
import sys
from PyQt4.QtCore import QTimer
from PyQt4.QtGui import (
QApplication,
QWidget,
QVBoxLayout,
QPushButton,
)
class MyApp(QWidget):
def __init__(self,*args,**kwargs):
QWidget.__init__(self,*args,**kwargs)
self.layout = QVBoxLayout(self)
self.button = QPushButton('Start timer')
self.button.clicked.connect(self.start_timer)
self.layout.addWidget(self.button)
self.timer = QTimer()
self.timer.timeout.connect(self.hello)
self.timer.setSingleShot(True)
def start_timer(self):
self.timer.start(3000)
def hello(self):
print('Hello!')
# Create QApplication and QWidget
qapp = QApplication(sys.argv)
app = MyApp()
app.show()
qapp.exec_()
答案 2 :(得分:1)
如果完全需要创建第二个QTimer
,那么您的方法就足够了。你可以做什么创造一个能够进行这种簿记的功能或类。
您可以使用QBasicTimer
。文档:
QTimer类提供高级编程接口,具有单次定时器和定时器信号,而不是事件。还有一个QBasicTimer类比QTimer更轻量级,并且比直接使用计时器ID更不笨。
如果你想完全摆脱current_timer
那么我会建议你调用current_timer.deleteLater
函数。确保在调用此函数后立即为其分配新的QTimer
,或del
/通过del current_timer
删除它,否则如果您稍后引用任何属性,则会引发错误说类似于C++ object not found
。
答案 3 :(得分:-1)
Snackbar.make(view.findViewById(android.R.id.content), "Message", Snackbar.LENGTH_LONG).show();