我是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 我不知道,如何解决它。任何帮助,将不胜感激。 提前致谢
答案 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秒。检查是否有效并根据需要进行修改。