更新 GUI 计数器,针对来自 GPIO 的每个高信号

Update counter for GUI, for every high signal from GPIO

我正在尝试从 GPIO 输入一个信号,我已将其分配给一个计数器,它将对每个高信号输入进行计数。但是,GUI 仅显示“1”。我可能对循环感到困惑,因为计数器不会增加。

我知道GUI是阻塞的,但我不知道如何实现。

这是我尝试过的以下尝试:

from guizero import App, Text
import RPi.GPIO as GPIO
import time

sensor = 16

global count

GPIO.setmode(GPIO.BOARD)
GPIO.setup(sensor,GPIO.IN)

app = App("Counter")
text = Text(app, text="1")

#when GPIO is high, however this only stops to 1
if GPIO.input(sensor):
    print('detected')
    def counter():
        #add counter and change value by adding one
        text.value = int(text.value) + 1
    while GPIO.input(sensor):
        time.sleep(0.01)
           
app.display()

我认为您可以在 while 循环中调用 counter() 函数来实现计数器,如下所示: counter() 在 time.sleep(0..01) 之前 我想这有帮助。

你的主要问题是你定义了函数 counter() 但你没有在 while-loop.

中执行它

但存在不同的问题 - 大多数 GUI 不喜欢循环,因为它会阻止 GUI 用于获取 (key/mouse/etc.) 系统事件、将它们发送到小部件、更新小部件的主循环。但是大多数图形用户界面都有一些延迟执行功能的方法,它可以用来周期性地执行代码而不使用循环。

我无法测试,但可能是

from guizero import App, Text
import RPi.GPIO as GPIO

# --- functions ---

def counter():
    if GPIO.input(sensor):
        text.value = int(text.value) + 1
    else:
        text.cancel(counter) # stop this loop
        #app.destroy() # exit program   

# --- main ---

sensor = 16

GPIO.setmode(GPIO.BOARD)
GPIO.setup(sensor, GPIO.IN)

app = App("Counter")
text = Text(app, text="1")

text.repeat(10, counter)  # Schedule call to counter() every 10ms (0.01s)

app.display()

顺便说一句: 使用 Google 我在 guizero 文档中找到了解决方案:Loops and sleeping and App(参见 MethodsApp).