在python上执行x秒的函数

时间:2016-07-19 16:34:09

标签: python user-interface

我是python编程的新手。我正在尝试开发一个运行在Raspy3上的软件。问题是,我想要一个按钮在x秒内执行一个功能(在这种情况下为10)。我尝试使用QTimer.singleshot,使用Lambda,但它冻结了我的计算机和Windows控制台说: QEventDispatcherWin32::registertime: Failed to create a timer - the process has used the maximun number of handlers allowed by the system(翻译自西班牙语) 这是该程序的代码:

import sys
import time
from PyQt4.QtCore import *
from PyQt4.QtCore import (QTime)
from PyQt4.QtCore import pyqtSignal as Signal
from PyQt4.QtGui import *
import ui_1


class Ventana(QMainWindow, ui_1.Ui_Ventana):

    def __init__(self, parent=None):
        super(Ventana, self).__init__(parent)
        self.setupUi(self)
        self.showMaximized()
        self.botonBlanco.clicked.connect(self.blanco)       
        self.sliderBlanco.valueChanged.connect(self.sliderC)
        self.labelBlanco.setText("Toma muestra durante 60 segundos para setear el blanco")
        blancoA = False

    def blanco(self):
        cr = 0
        while cr != 10:
            QTimer.singleShot(1000, lambda: crono(cr))

    def crono(self, cr):
        cr += 1
        return cr

    def sliderC(self):
        tiempoBlanco = self.sliderBlanco.value()
        self.labelBlanco.setText("Toma muestra durante %i segundos para setear el blanco" % tiempoBlanco)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Ventana()
    form.show()
    app.exec_()

我正在使用Python 2.7.11和PyQt 4 GUI 我不知道,如何解决它。任何帮助,将不胜感激。 提前致谢

2 个答案:

答案 0 :(得分:0)

如果没有ui_1模块,我无法对此进行进一步调试,但这可能会解决您在解决当前问题后遇到或将会遇到的错误。

import sys
import time
from PyQt4.QtCore import *
from PyQt4.QtCore import (QTime)
from PyQt4.QtCore import pyqtSignal as Signal
from PyQt4.QtGui import *
import ui_1


class Ventana(QMainWindow, ui_1.Ui_Ventana):

    def __init__(self, parent=None):
        super(Ventana, self).__init__(parent)
        self.setupUi(self)
        self.showMaximized()
        self.botonBlanco.clicked.connect(self.blanco)       
        self.sliderBlanco.valueChanged.connect(self.sliderC)
        self.labelBlanco.setText("Toma muestra durante 60 segundos para setear el blanco")
        blancoA = False

    def blanco(self):
        self.cr = 0
        while self.cr != 10:
            QTimer.singleShot(1000, self.crono)

    def crono(self):
        self.cr += 1

    def sliderC(self):
        tiempoBlanco = self.sliderBlanco.value()
        self.labelBlanco.setText("Toma muestra durante %i segundos para setear el blanco" % tiempoBlanco)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    form = Ventana()
    form.show()
    app.exec_()

注意self.crono调用中Qtimer的更改以及将cr变量的实例更改为对象属性:self.cr

答案 1 :(得分:0)

在你的函数blanco中,cr永远不会增加。从crono函数返回的值未在任何位置分配。我从来没有使用过PyQt(只有Qt4 C ++),但你可以试试这个(我不知道你的滑块在做什么,所以请原谅我,因为我会忽略它们:)):

添加__init__这个:

self.cr = 0

看来你的blanco函数启动了计时器,改变它如下:

def blanco(self):
    if self.cr > 10:
        # don't start the sec counter if 10s passed
        self.cr = 0
    else:
        QTimer.singleShot(1000, self.crono)

你需要每秒调用blanco来重置计时器,你也需要在调用crono之后每秒执行你想要做的动作。所以,在crono中执行以下两项操作:

def crono(self):
    self.cr = self.cr + 1
    self.labelBlanco.setText("Total of %i seconds passed." % tiempoBlanco)
    self.blanco()

这应该在按下botonBlanco后每秒更换labelBlanco总共10秒。检查是否有效并根据需要进行修改。