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.

War es hilfreich?

Lösung

  1. Diese Frage ist nützlich: tkinter-Schleife und serielles Schreiben Es könnte mit zwei Änderungen kopiert werden: master.update werden QtGui.qApp.processEvents und master.after werden QTimer.singleShot.

  2. 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 verwenden QTimer.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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top