Comment quitter le programme dans la boucle while à l'aide du bouton-poussoir en PyQt
Question
J'ai le code suivant qui débutera après avoir cliqué sur le bouton "Démarrer" dans 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)"
Le programme ci-dessus est pour les ADC de la lecture, et il va commencer après avoir cliqué sur le bouton appelé "Start" comme : self.pushButton.clicked.connect( self.Start)
Et j'ai une autre pushButton_2
appelé "Stop" et en cliquant sur ce le processus ci-dessus doit s'arrêter.S'il vous plaît suggérer, afin que je puisse en mesure de le faire.
La solution
Cette question est utile: tkinter boucle de série et écrire Il pourrait être copié plus de deux modifications:
master.update
devientQtGui.qApp.processEvents
etmaster.after
devientQTimer.singleShot
.Voici une esquisse de la façon de faire ce que vous demandez avec 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 # ...
Depuis je ne sais pas ce que votre code ressemble, voici un exemple de travail à l'aide de PyQT4 et 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
utiliseQTimer.singleShot(time, function)
pour faire continuer la boucle.Vous pouvez également arrêter la boucle avec
stopLoop()
de guiLoop.
Autres conseils
Il n'est pas nécessaire de faire autre chose que ce que j'ai proposé dans votre autre question sur ce sujet:utilisez simplement processEvents
.Tant que vous pouvez l'appeler comme ça assez souvent (mais pas trop fréquemment), il convient de faire exactement ce que vous voulez.À l'aide de votre deuxième exemple, le code suivant fonctionne très bien pour moi:
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()