So beenden Sie das Programm in der while-Schleife mit der Taste in PyQt
Frage
Ich habe den folgenden Code, der nach dem Klicken auf die Schaltfläche 'Start' in PyQt gestartet wird:
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)"
Das obige Programm dient zum Lesen von ADCs und wird nach dem Klicken auf die Schaltfläche 'Start' als gestartet : self.pushButton.clicked.connect( self.Start)
Und ich habe noch einen pushButton_2
wird 'Stop' genannt und durch Klicken darauf sollte der obige Vorgang beendet werden.Bitte schlagen Sie vor, damit ich das tun kann.
Lösung
Diese Frage ist nützlich: tkinter-Schleife und serielles Schreiben Es könnte mit zwei Änderungen kopiert werden:
master.update
werdenQtGui.qApp.processEvents
undmaster.after
werdenQTimer.singleShot
.Hier ist eine Skizze, wie Sie das tun, wonach Sie fragen 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 # ...
Da ich nicht weiß, wie Ihr Code aussieht, hier ein funktionierendes Beispiel mit PyQt4 und 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
verwendenQTimer.singleShot(time, function)
um die Schleife fortzusetzen.Sie können die Schleife auch stoppen mit
stopLoop()
von guiLoop.
Andere Tipps
Es besteht keine Notwendigkeit, etwas anderes zu tun als was ich vorgeschlagen habe in Ihrer anderen Frage zu diesem Thema:benutze einfach processEvents
.Solange du es oft genug anrufen kannst (aber nicht zu häufig), sollte es genau das tun, was Sie wollen.In Ihrem zweiten Beispiel funktioniert das Folgende für mich gut:
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()