树莓派RGB LED矩阵比分板:解决OverflowError负数值转size_t报错
问题解决:OverflowError: can't convert negative value to size_t
这个报错的根源很明确:你用的RGB矩阵库底层基于C实现,SetImage的坐标参数要求是无符号整数(size_t类型),但你传递了负数,负数转无符号类型会直接触发溢出错误。
为什么封装后才出问题?
未封装时你的队徽坐标计算刚好没产生负数,封装run_code函数后,要么是变量作用域变化(比如矩阵宽度、队徽尺寸的变量没正确传递/初始化),要么是动态获取的队徽尺寸超过了矩阵宽度,导致居中计算时得到负数(比如执行(矩阵宽度 - 队徽宽度)//2时,队徽更宽就会得到负结果)。
具体修复步骤
- 定位队徽坐标计算代码
找到调用matrix.SetImage绘制队徽的代码段,检查x/y坐标的计算逻辑,比如类似这样的代码:
logo_x = (matrix.width - logo_img.width) // 2 logo_y = 2
- 强制坐标非负
给坐标添加边界检查,确保不会传入负数:
# 修正坐标,避免负数 logo_x = max(0, (matrix.width - logo_img.width) // 2) logo_y = max(0, logo_y) # 再调用SetImage matrix.SetImage(logo_img, x=logo_x, y=logo_y)
排查变量初始化问题
检查run_code函数里的初始化顺序:是不是在计算坐标前,matrix.width或者logo_img.width还没被正确赋值?比如有没有把全局变量改成局部变量后漏传参数?可选:限制队徽尺寸
如果队徽尺寸经常超过矩阵,直接裁剪队徽到矩阵能容纳的大小:
from PIL import Image # 把队徽缩放到不超过矩阵宽度 max_logo_width = matrix.width if logo_img.width > max_logo_width: scale_ratio = max_logo_width / logo_img.width new_height = int(logo_img.height * scale_ratio) logo_img = logo_img.resize((max_logo_width, new_height), Image.Resampling.LANCZOS)
验证
修改后重新运行run_code,如果比分和队徽都能正常显示,就说明问题解决了。
内容的提问来源于stack exchange,提问作者Kratos
相关产品推荐
相关产品推荐

