gpiozero 在事件驱动代码中组合按钮事件

问题描述 投票:0回答:1

我对 Python 和 Raspberry 业务还很陌生,目前正在开发我的第一个主要应用程序。我喜欢 gpiozero 以及自始至终处理事件的能力。

我想让我的代码“事件驱动”和“实际上”(也许)只有一个美丽的问题。 我想组合查询不同的状态。例子:

BTN1 + BTN2 => 活动 1

BTN1 + !BTN2 => 活动 2

BTN3 + BTN1 => 活动 3 等

有没有一种很好的方法来组合这里的信号?

我看到你可以做这样的事情:

led.source = all_values(btn1, btn2)
然而,这对我来说还不够;无论如何我都必须调用我自己的函数。

我目前唯一的想法是这样的:

button1 = Button(1)
button2 = Button(2)

def check_btns():
    if button1.is_pressed && button2.is_pressed:
       btn1_btn2_pressed()

def btn1_btn2_pressed():
    print("Both pressed")   

button1.when_pressed = check_btns
button2.when_pressed = check_btns

有人知道组合查询事件的更优雅的解决方案吗?

问候

python raspberry-pi raspberry-pi4 gpiozero
1个回答
0
投票

不确定我是否理解这个问题,但这就是......

您可以使用位掩码,其中每个位代表每个按钮的状态。例如:

0b1010
  |||^- button 1 state
  ||^-- button 2 state
  |^--- button 3 state
  ^---- button 4 state

然后您可以使用这些值作为字典中的键,其中值是函数:

def four_and_one():
    print("Buttons 1 and 4 pressed")

def two():
    print("Button 2 pressed")

funcs = {
    0b1001: four_and_one
    0b0010: two
    ...
}

然后,在检查按钮时构建蒙版:

def check_btns():
    mask = button1.is_pressed      | \
           button2.is_pressed << 1 | \
           button3.is_pressed << 2 | \
           button4.is_pressed << 3
    if mask in funcs:
         funcs[mask]()
© www.soinside.com 2019 - 2024. All rights reserved.