Comment quitter le programme dans la boucle while à l'aide du bouton-poussoir en PyQt

StackOverflow https://stackoverflow.com//questions/23057031

  •  23-12-2019
  •  | 
  •  

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.

Était-ce utile?

La solution

  1. Cette question est utile: tkinter boucle de série et écrire Il pourrait être copié plus de deux modifications: master.update devient QtGui.qApp.processEvents et master.after devient QTimer.singleShot.

  2. 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 utilise QTimer.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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top