更新 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(参见 Methods
在 App
).
我正在尝试从 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(参见 Methods
在 App
).