pythonraspberry-pigpiozero

Python break out of poll when key pressed


Apologies for the newbie Python post, but a bit of Googling and I still can't find what I need.

I have the following Pi Hat; https://github.com/modmypi/Jam-HAT, ...and I'm using their docs to guide me; https://gpiozero.readthedocs.io/en/stable/recipes.html

My idea is pretty simple;

However, I'm stuck on the part where I need to stop the script with a button

#!/usr/bin/env python3

import gpiozero
import subprocess
from signal import pause
from time import sleep

button1 = gpiozero.Button(18)
button2 = gpiozero.Button(19)
green1  = gpiozero.LED(16)
green2  = gpiozero.LED(17)
red1    = gpiozero.LED(5)
red2    = gpiozero.LED(6)
script  = ""
yellow1 = gpiozero.LED(12)
yellow2 = gpiozero.LED(13)

def kill_hello():
    global script
    script.kill()
    print("Killed PID: ", script.pid)
    red1.on()
    sleep(.5)
    red1.off()
    red2.on()
    sleep(.5)
    red2.off()

def say_hello():
    global script
    green1.on()
    sleep(.5)
    green1.off()
    green2.on()
    sleep(.5)
    green2.off()
    script = subprocess.Popen(['/home/kali/hello.sh'])
    print("Script PID: ", script.pid)
    while script.poll() is None:
        if not button2.when_pressed:
            green1.on()
            sleep(.5)
            green1.off()
            sleep(1)
        button2.when_pressed = kill_hello

print("Press Ctrl & C to Quit")

try:
    button1.when_pressed = say_hello
    pause()
except KeyboardInterrupt:
    print( "\n...Quit!")

I've tried a try/except where that while loop is, but that has also not worked (not like the KeyboardInterrupt). It doesn't recognise the button has been pressed, and I'm assuming because it's not within a valid catch/else/something block.

Any suggestions for a simple break out of loop, please?


Solution

  • It seems the issue is around a single process is hogging Python, thus creating multiple threads helped;

    #!/usr/bin/env python3
    
    import gpiozero
    import subprocess
    import time
    import threading
    from signal import pause
    
    button1 = gpiozero.Button(18)
    button2 = gpiozero.Button(19)
    green1  = gpiozero.LED(16)
    green2  = gpiozero.LED(17)
    red1    = gpiozero.LED(5)
    red2    = gpiozero.LED(6)
    script  = ""
    yellow1 = gpiozero.LED(12)
    yellow2 = gpiozero.LED(13)
    switch  = True
    
    def blink():
        def run():
            while (switch == True):
                green1.on()
                time.sleep(.2)
                green1.off()
                time.sleep(.2)
                if switch == False:
                    break
        thread = threading.Thread(target=run)
        thread.start()
    
    def switchon():
        global switch
        global script
        switch = True
        print('switch on')
        script = subprocess.Popen(['/home/kali/hello.sh'])
        blink()
    
    def switchoff():
        global switch
        global script
        print('switch off')
        script.kill()
        switch = False
    
    try:
        button1.when_pressed = switchon
        button2.when_pressed = switchoff
        pause()
    except KeyboardInterrupt:
        print( "\n...Quit!")