我怎样才能在PyQt4中杀掉一次QtCore.QTimer?

时间:2014-01-12 20:30:37

标签: python python-2.7 timer pyqt pyqt4

因此,在我的应用程序中,我创建了一个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'

由于

4 个答案:

答案 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();