簡體   English   中英

按下鍵時Python中斷輪詢

[英]Python break out of poll when key pressed

為新手 Python 帖子道歉,但有點谷歌搜索,我仍然找不到我需要的東西。

我有以下 Pi Hat; https://github.com/modmypi/Jam-HAT ,...我正在使用他們的文檔來指導我; https://gpiozero.readthedocs.io/en/stable/recipes.html

我的想法很簡單;

  • 按下按鈕時運行腳本
  • 等待它運行,在運行時顯示閃爍的燈光
  • 如果我按下另一個按鈕,停止/終止腳本

但是,我被困在需要用按鈕停止腳本的部分

#!/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!")

我試過try / except while循環所在的位置,但這也不起作用(不像KeyboardInterrupt )。 它無法識別按鈕已被按下,我假設是因為它不在有效的 catch/else/something 塊內。

請問有什么簡單的跳出循環的建議嗎?

似乎問題是圍繞單個進程占用 Python,因此創建多個線程有幫助;

#!/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!")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM