我是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我不知道该怎么修。如果能帮忙,我将不胜感激。提前感谢
在函数blanco
中,cr从不递增。从crono函数返回的值没有分配到任何位置。我从未使用过PyQt(只有Qt4 C++),但你可以试试这个(我不知道你的滑块在做什么,所以对不起,我要忽略它们:):
添加您的__init__
this:
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后的10秒内每秒更改标签Blanco。检查这是否有效,并根据您的需要进行修改。
如果没有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_()
注意Qtimer
调用中对self.crono
的更改,以及将cr
变量的实例更改为对象属性:self.cr