I have the following code which will start after clicking the \'Start\' button in PyQt:
def Start(self):
import time
import os
import RPi.GPIO as GPIO
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.
Here is a sketch of how to do what you ask for with 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:
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.
You can also stop the loop with stopLoop() of guiLoop.
There is no need to do anything other than what I suggested in your other question on this topic: just use 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()