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
相关产品推荐
相关产品推荐

