Pregunta

Tengo el siguiente código que se iniciará después de hacer clic en el botón "Inicio" en PyQt:

def Start(self):
  import time
  import os
  import RPi.GPIO as GPIO
  import datetime

  GPIO.setmode(GPIO.BCM)
  DEBUG = 1

  os.system('clear')

  # SPI port on GPIO
  SPICLK = 18
  SPIMISO = 23
  SPICS = 25

  # set up the SPI interface pins
  GPIO.setup(SPIMISO, GPIO.IN)
  GPIO.setup(SPICLK, GPIO.OUT)
  GPIO.setup(SPICS, GPIO.OUT)

  GPIO.output(SPICS, True)
  GPIO.output(SPICS, False) # bring CS low
  while True:
        adcout = 0             
        read_adc = 0
        #s=time.clock()
        for i in range(25):
            GPIO.output(SPICLK, True)
            GPIO.output(SPICLK, False)
            adcout <<= 1
            if (GPIO.input(SPIMISO)==1):
                adcout |= 0x1
        time.sleep(0.085)   
        if (GPIO.input(SPIMISO)==0):
            read_adc = adcout
            millivolts = read_adc * ( 2500.0 /(pow(2,22)))
            read_adc = "%d" % read_adc
            millivolts = "%d" % millivolts

        if DEBUG:
            print millivolts, "mV (ADC)"

El programa anterior es para ADC lectura y se iniciará después de hacer clic en el botón llamado 'Inicio' como : self.pushButton.clicked.connect( self.Start)

Y tengo otra pushButton_2 se llama "Stop" y haciendo clic en este el proceso anterior se debe detener.Por favor, sugiera, por lo que puede capaz de hacer eso.

¿Fue útil?

Solución

  1. Esta pregunta es útil: tkinter bucle de serie y escribir Podría ser copiado con dos cambios: master.update se convierte en QtGui.qApp.processEvents y master.after se convierte en QTimer.singleShot.

  2. Aquí es un boceto de cómo hacer lo que pides, con guiLoop:

    from guiLoop import guiLoop, stopLoop
    # ... means fill in your code
    class ...: 
        started = False
    
        def Start(self):
            if not self.started:
                # you can also use threads here, see the first link
                self.started = self.StartLoop()
    
        def Stop(self):
            if self.started:
                stopLoop(self.started)
                self.started = False
    
        @guiLoop
        def StartLoop(self):
            # This is your Start function
            # ...
            while True:
                # ...
                yield 0.085 # time.sleep(0.085) equivalent
                # ...
    

    Ya no sé cuál es el código parecer, aquí es un ejemplo de trabajo utilizando PyQT4 y guiLoop:

    from PyQt4 import QtGui
    import sys
    
    from guiLoop import guiLoop # https://gist.github.com/niccokunzmann/8673951
    
    @guiLoop
    def led_blink(argument):
        while 1:
            print("LED on " + argument)
            yield 0.5 # time to wait
            print("LED off " + argument)
            yield 0.5
    
    app = QtGui.QApplication(sys.argv)
    
    w = QtGui.QWidget()
    w.resize(250, 150)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()
    
    led_blink(w, 'shiny!')
    
    sys.exit(app.exec_())
    

    guiLoop utiliza QTimer.singleShot(time, function) para hacer el bucle de continuar.

    También puede detener el bucle con stopLoop() de guiLoop.

Otros consejos

No hay necesidad de hacer nada más que lo que sugerí en su otra pregunta sobre este tema: solo use processEvents.Mientras pueda llamarlo con frecuencia (pero no también con frecuencia), debe hacer exactamente lo que quiere.Usando su segundo ejemplo, lo siguiente funciona bien para mí:

  def Start(self):
    if not self.started:
        self.started = True
        self.StartLoop()

  def Stop(self):
    if self.started:
        self.started = False

  def StartLoop(self):
    DEBUG = 1
    while self.started:
        print "LED on "
        time.sleep(0.05)
        print "LED off "
        time.sleep(0.085)
        QtGui.qApp.processEvents()

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top