2016-07-19 8 views
0

Ich bin neu in Python-Programmierung. Ich versuche eine Software zu entwickeln, die auf Raspy3 läuft. Das Problem ist, dass ich möchte, dass eine Taste während x Sekunden eine Funktion ausführt (in diesem Fall 10). Ich habe versucht, mit QTimer.singleshot, Lambda verwenden, aber es friert mein Computer und Windows-Konsole sagt etwas wie: QEventDispatcherWin32::registertime: Failed to create a timer - the process has used the maximun number of handlers allowed by the system (aus dem Spanischen übersetzt) ​​ Hier ist der Code des Programms ist:Führe eine Funktion für x Sekunden auf 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_() 

Ich verwende Python 2.7 .11 und PyQt 4 GUI Ich weiß nicht, wie es zu beheben ist. Jede Hilfe wäre willkommen. Vielen Dank im Voraus

+0

nicht sicher, ob dies hilft, aber Ihre Lambda-Funktion gibt keine Variablen zurück, wenn es aufgerufen wird, in 'self.crono' ist die Variable cr privat und keine Änderungen an der cr-Variable in der Bereich von 'blanco' – Aaron

+0

@Aaron +1, auch, was meinst du mit" führe eine Funktion während 'x' Sekunden aus". Ich nehme an, Sie möchten die Bezeichnung für 1 Sekunde ändern, nachdem eine Schaltfläche geklickt wurde? –

+0

@Aaron, das kann den Grund für das Scheitern erklären ... Ich werde das überprüfen. –

Antwort

0

in Ihrer Funktion blanco cr werden nie erhöht. Der von der Crono-Funktion zurückgegebene Wert wird nirgendwo zugewiesen. Ich habe nie PyQt (nur Qt4 C++) verwendet, aber Sie können versuchen, diese (ich weiß nicht, was Ihre Schieber tun, so entschuldigen Sie mich, wie ich werde sie bin ignorieren :)):

Fügen Sie Ihre __init__ dieses:

self.cr = 0 

es scheint Ihre blanco Funktion der Timer gestartet wird, ändern Sie es wie folgt aus:

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) 

Sie benötigen blanco jede Sekunde rufen den Timer zurückzusetzen, auch müssen Sie die Aktion, die Sie tun möchten, tun jede Sekunde nach Crono wird gerufen. Also, diese beiden Dinge in crono:

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

Dies sollte die labelBlanco jede Sekunde ändern für insgesamt 10 Sekunden nach dem botonBlanco gedrückt wird. Überprüfen Sie, ob das funktioniert und passen Sie es an Ihre Bedürfnisse an.

0

Ohne Ihre ui_1 Modul, kann ich nicht wirklich debuggen diese weiter, aber dies auf einen Fehler lösen können Sie mit oder haben werden, sobald Sie Ihr aktuelles Problem lösen ..

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_() 

Anmerkung Änderungen an self.crono in Qtimer Aufruf sowie wechselnde Instanzen Ihrer cr Variable auf ein Objekt Attribut: self.cr