【问题标题】:Raspberry PI Sense Hat Joystick triggering event on resetRaspberry PI Sense Hat 操纵杆在重置时触发事件
【发布时间】:2016-02-16 02:34:24
【问题描述】:

我有一个简单的 Python 程序,它使用感应帽操纵杆作为输入,它调用帽子上各种传感器的读数并将它们的值返回到 8x8 LED 显示屏。该程序有效,但只有一个问题,它返回每个 show_message() 两次。一次在初始按下时,当操纵杆“重置”时再次按下。我知道这一点,因为如果我举起它,它会显示温度,然后当我松开它时,它会再次显示。

谁能帮我只显示一次消息? pygame 事件似乎将操纵杆与箭头键绑定在一起,查看 pygame 文档我没有看到任何关于重置的提及。

这是我的代码:

from sense_hat import AstroPi
import time
import datetime
import pygame
from pygame.locals import *

ap = AstroPi()
ap.clear()

pygame.init()
pygame.display.set_mode((640,480))


pressure = 'P: ' + str(int(ap.get_pressure()))
temp =  'T: ' + str(int(ap.get_temperature_from_pressure()))
humidity = 'H: ' + str(int(ap.get_humidity()))
blah = 'blah!'

def handle_event(event):
    if event.key == pygame.K_DOWN:
        ap.show_message(pressure)
    elif event.key == pygame.K_UP:
        ap.show_message(temp)
    elif event.key == pygame.K_LEFT:
        ap.show_message(humidity)
    elif event.key == pygame.K_RIGHT:
        ap.show_message(blah)       


running = True

while running:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            handle_event(event)
        if event.type == KEYUP:
            handle_event(event)
        if event.type == K_ESCAPE:
            running = False
        if event.type == pygame.QUIT:
            running = False

【问题讨论】:

    标签: python raspberry-pi pygame raspberry-pi2


    【解决方案1】:

    您在这里的反应可能有限,因为不是每个人都拥有传感器帽(包括我),但我会尝试一下。我拥有的一些传感器存在连续读取发生太快的问题。通常读数之间的延迟可以解决问题。我无法测试它,但这是一个很好的起点。请尝试以下操作:

    import time
    # after each handle_event() call in the second loop try adding a delay such as
    handle.event(event)
    time.sleep(1)
    

    如果发生这种情况可以解决问题,请尝试将睡眠时间减少到更小的数字 (.01) 或直到问题再次出现。如果这没有帮助,我们可以继续挖掘。

    【讨论】:

    • 感谢克里斯的回复!唯一的问题是它不是一个快速连续读取的问题。它是当操纵杆上升时它发送向上信号,当它“重置”也就是点击回到中立位置时它再次发送向上信号。如果我只是快速启动并释放,它会运行我的 up 方法两次。如果我按住它,它会运行一次,然后每当我松开操纵杆时,它就会再次运行它。所以睡眠只会进一步延迟重置方法调用,但不会绕过它。也许我可以编写一个忽略所有其他点击的方法
    【解决方案2】:

    我在圣诞节得到了一个 Pi 和 SenseHat。我尝试了你的程序,发现如果我删除了前两个 if 语句中的一个。

    (if event.type == KEYDOWN:) or ( if event.type == KEYUP:)
    

    它只会工作一次。我知道我迟到了一年,但我希望这会有所帮助。

    您的问题帮助我进一步了解了 SenseHat 操纵杆。​​p>

    【讨论】:

      【解决方案3】:

      当我尝试在传感器周围移动一个红色方块时,我遇到了类似的问题。当我按下操纵杆上的向右或向左方向时,它变成了两个方块。要解决这个问题,只需创建一个包含 event.direction 和 event.action 的 AND 语句

      if event.direction == 'right' and event.action == 'pressed':
      

      所以它只在最初按下操纵杆时执行

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多