简体   繁体   English

如何使用PyQt中的按钮退出while循环中的程序

[英]How to quit the program in while loop using push-button in PyQt

I have the following code which will start after clicking the 'Start' button in PyQt: 我有以下代码,它将在单击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)"

The above program is for ADC reading and it will start after clicking the pushbutton called 'Start' as : self.pushButton.clicked.connect( self.Start) 以上程序用于ADC读取,点击“Start”按钮后将启动: self.pushButton.clicked.connect( self.Start)

And I have another pushButton_2 called 'Stop' and by clicking this the above process should stop.Please suggest, so I can able to do that. 我还有另一个名为'Stop'的pushButton_2 ,点击这个上面的过程就应该停止了。请建议,这样我就可以做到。

There is no need to do anything other than what I suggested in your other question on this topic: just use processEvents . 除了在你关于这个主题的其他问题中的建议之外 ,没有必要做任何事情:只使用processEvents As long as you can call it frequently enough (but not too frequently), it should do exactly what you want. 只要你能够频繁地调用它(但不是频繁),它应该完全按照你的意愿行事。 Using your second example, the following works fine for me: 使用您的第二个示例,以下对我来说很好:

  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()
  1. This question is useful: tkinter loop and serial write It could be copied over with two changes: master.update becomes QtGui.qApp.processEvents and master.after becomes QTimer.singleShot . 这个问题很有用: tkinter循环和串行写入可以通过两次更改复制它: master.update变为QtGui.qApp.processEventsmaster.after变为QTimer.singleShot

  2. Here is a sketch of how to do what you ask for with guiLoop : 这是一个如何用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 # ... 

    Since I do not know what your code look like, here is a working example using PyQT4 and guiLoop : 由于我不知道你的代码是什么样的,这里有一个使用PyQT4guiLoop的工作示例:

     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 uses QTimer.singleShot(time, function) to make the loop continue. guiLoop使用QTimer.singleShot(time, function)使循环继续。

    You can also stop the loop with stopLoop() of guiLoop. 你也可以使用stopLoop()来停止循环。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM