CircuitPython开发日光闹钟传Tuple参数报期望Integer错误如何解决
问题根源
你遇到的报错由两个核心问题导致:
- 类继承设计错误:
Alarm类不需要继承Clock类,二者是组合关系(Clock负责管理多个Alarm实例),而非is-a的继承关系。你让Alarm继承Clock后,实例化Alarm时会默认调用父类Clock(及其上层NeoPixel)的构造函数,父类要求第一个入参是int类型的引脚编号,第二个是int类型的灯珠数量,而你传入的第一个参数是时间元组(7,0,0),类型不匹配直接触发TypeError。 - 缩进错误(大概率):你贴出的
Alarm类代码存在缩进问题,__init__方法没有正确缩进为Alarm类的成员,导致Alarm类没有自定义构造函数,实例化时直接调用父类构造函数,进一步加剧参数不匹配问题。
修复方案(推荐)
修正类设计,去掉Alarm对Clock的继承,Alarm作为普通数据类存储闹钟配置即可:
修改Alarm类代码
class Alarm: # 新增clock入参,传入关联的Clock实例,用来调用时间计算方法 def __init__(self, clock, time, trigger, *args): self.absolute_alarm = clock.calculate_absolute_time(time) self.trigger = trigger self.args = args def trigger_alarm(self): self.trigger(*self.args)
修改Alarm实例化代码
# 把已经初始化完成的Clock实例作为第一个参数传入 wake_up_alarm = Alarm(clock_pixels, (7,0,0), light_bar_soft_fade, 1, pixels_60)
修正Clock类post方法的两个遗留问题
def post(self, t): self.clock_face = [] for each in range(0, 12): self.clock_face.append([0, 0, 0, 0]) self.clock_face[t.tm_hour % 12][0] = 1 self.clock_face[int(t.tm_min/5)][2] = 1 for each in range(0, 12): self[each] = self.clock_face[each] self.show() for alarm in self.alarms: # 调用实例方法需要加self前缀,触发报警调用trigger_alarm方法 if self.calculate_absolute_time(t) == alarm.absolute_alarm: alarm.trigger_alarm()
修复方案(不推荐,保留继承)
如果你坚持保留Alarm对Clock的继承,需要在Alarm的构造函数中显式调用父类构造函数,传入引脚、灯珠数等必填参数,但该设计不符合逻辑,后续维护成本很高,不建议使用。
内容的提问来源于stack exchange,提问作者Rosy Roseman
相关产品推荐
相关产品推荐

