You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RPi Sense Hat摇杆触发定时器脚本仅能运行一次的问题求助

解决Sense Hat摇杆触发定时器只能运行一次的问题

嘿,作为新手能写出这样的代码已经很棒啦!咱们来看看为什么摇杆只能触发一次定时器:

核心问题:timer列表没有重置

你的timer是全局变量,第一次调用time()函数时,它会被填充64个元素,并且前15个会被改成红色。当你再次按下摇杆调用time()时,代码会继续往已经有64个元素的timer里append新元素,导致它变成128个元素——而Sense Hat的LED矩阵只接受64个像素数据,这就会导致后续的set_pixels调用失败,定时器自然没法正常运行。

修复方案

我们只需要每次调用定时器函数时重新初始化timer列表,同时优化一些细节避免潜在问题。修改后的代码如下:

from sense_hat import SenseHat
from time import sleep

sense = SenseHat()
# 定义颜色常量
e = (0, 0, 0)
w = (255, 255, 255)
G = [0, 255, 0]
R = [255, 0, 0]
X = [0, 0, 0]

def run_timer(seconds=15):
    # 每次调用都重新初始化timer列表,避免复用旧数据
    timer = []
    # 填充初始的绿色像素矩阵
    for i in range(64):
        if i < seconds:
            timer.append(G)
        else:
            timer.append(X)
    sense.set_pixels(timer)
    
    # 逐个将绿色像素改为红色,模拟倒计时
    for i in range(seconds):
        sleep(1)
        timer[i] = R
        sense.set_pixels(timer)
    
    # 闪烁提醒定时器结束
    for _ in range(10):
        sense.clear()
        sleep(0.1)
        sense.set_pixels(timer)
        sleep(0.1)
    sense.clear()

while True:
    # 处理摇杆事件
    for event in sense.stick.get_events():
        if event.action == "pressed" and event.direction == "up":
            run_timer()

额外优化说明

  • 把函数名从time()改成run_timer(),避免和Python内置的time模块重名,减少潜在冲突
  • 将定时器时长作为参数传入函数,以后想调整时长直接传参即可,不用修改常量
  • 用_代替循环里未使用的变量,这是Python里的通用惯例,让代码更易读

这样修改后,每次按下摇杆向上键,都会重新创建一个干净的timer列表,就不会出现元素过多的问题,定时器就能正常重复触发啦!

内容的提问来源于stack exchange,提问作者maribou912

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:45:04