Cómo salir del programa en bucle while utilizando el pulsador en PyQt
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.
Solución
Esta pregunta es útil: tkinter bucle de serie y escribir Podría ser copiado con dos cambios:
master.update
se convierte enQtGui.qApp.processEvents
ymaster.after
se convierte enQTimer.singleShot
.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
utilizaQTimer.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()