我有一个简单的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
你可能在这里的反应有限,因为不是每个人都拥有传感器帽子,(包括我(,但我会试一试。我拥有的一些传感器存在连续读取发生过快的问题。通常,读数之间的延迟可以解决问题。我无法测试它,但这是一个很好的起点。请尝试以下操作:
import time
# after each handle_event() call in the second loop try adding a delay such as
handle.event(event)
time.sleep(1)
如果这恰好可以解决问题,请尝试将睡眠时间减少到更小的数字 (.01( 或直到问题再次出现。如果这没有帮助,我们可以继续挖掘。
圣诞节我得到了一个Pi&SenseHat。我尝试了您的程序,发现是否删除了前两个if
语句之一。
(if event.type == KEYDOWN:) or ( if event.type == KEYUP:)
它只能工作一次。 我知道我迟到了一年,但我希望这有所帮助。
您的问题帮助我了解有关SenseHat操纵杆的更多信息。
当我尝试在传感器周围移动一个红色方块时,我遇到了类似的问题。当我在操纵杆上按右或向左方向时,它变成了两个方块。要解决此问题,只需创建一个同时包含 event.direction 和 event.action 的 AND 语句
if event.direction == 'right' and event.action == 'pressed':
因此,它仅在最初按下操纵杆时执行