2016-07-19 2 views
0

Я новичок в программировании на питоне. Я пытаюсь разработать программное обеспечение на Raspy3. Проблема в том, что я хочу, чтобы кнопка выполняла функцию в течение x секунд (в этом случае 10). Я попытался с помощью QTimer.singleshot, используя лямбда, но она замерзает компьютер и окна консоли говорит что-то вроде: QEventDispatcherWin32::registertime: Failed to create a timer - the process has used the maximun number of handlers allowed by the system (в переводе с испанского) Вот код программы:Выполнить функцию на x секунд на python

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

Не уверен, что это помогает, но ваша лямбда-функция не возвращает никаких переменных, когда она вызывается, внутри 'self.crono' переменная cr является частной, и любые изменения в ней не будут вноситься в cr-переменную в область действия 'blanco' – Aaron

+0

@Aaron +1, также что вы подразумеваете под« выполнением функции в течение 'x' секунд». Я предполагаю, что вы хотите изменить ярлык в течение 1 секунды после нажатия кнопки? –

+0

@ Аарон, это может объяснить причину неудачи ... Я проверю это. –

ответ

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) 

вы должны вызвать Бланко каждый второй, чтобы сбросить таймер, и вы должны сделать действие, которое вы хотите сделать каждую секунду после вызова crono. Таким образом, сделать эти две вещи в crono:

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

Это должно изменить labelBlanco каждый второй в общей сложности 10 секунд после того, как botonBlanco нажата. Проверьте, работает ли это, и измените его в соответствии с вашими потребностями.

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

Смежные вопросы