labelimg安装后在标注过程中闪退和死机,并在控制台出现如下错误提示:
raceback (most recent call last): File "D:\dev\python3.12.0\Lib\site-packages\libs\canvas.py", line 530, in paintEvent p.drawLine(self.prev_point.x(), 0, self.prev_point.x(), self.pixmap.height()) 运行labelimg时候出现如下错误:TypeError: arguments did not match any overloaded call: drawLine(self, l: QLineF): argument 1 has unexpected type 'float' drawLine(self, line: QLine): argument 1 has unexpected type 'float' drawLine(self, x1: int, y1: int, x2: int, y2: int): argument 1 has unexpected type 'float' drawLine(self, p1: QPoint, p2: QPoint): argument 1 has unexpected type 'float' drawLine(self, p1: Union[QPointF, QPoint], p2: Union[QPointF, QPoint]): argument 1 has unexpected type 'float'
经过查找资料发现是labelimg版本不能PQ5版本兼容出现的问题,具体的说是使用的 Python 版本较高(当前是 Python 3.12),而 LabelImg 这个工具在较新的 PyQt5 库中,绘图函数不再支持传入浮点数(float),必须强制转换为整数(int)。
具体处理的方法如下:
1. 修改 canvas.py 文件(解决核心报错)
根据报错提示,找到 D:\dev\python3.12.0\Lib\site-packages\libs\canvas.py 这个文件,用文本编辑器(如记事本、VS Code等)打开它。
找到第 530 行左右的代码:
p.drawLine(self.prev_point.x(), 0, self.prev_point.x(), self.pixmap.height())
将其修改为(在坐标数值外包裹 int() 进行强制转换):
p.drawLine(int(self.prev_point.x()), 0, int(self.prev_point.x()), int(self.pixmap.height()))
建议顺手修复同文件下的其他潜在报错 :
为了防止后续出现类似的闪退,建议同时检查并修改该文件中第 526 行和第 531 行的代码:
- 第 526 行修改为:
p.drawRect(int(left_top.x()), int(left_top.y()), int(rect_width), int(rect_height)) - 第 531 行修改为:
p.drawLine(0, int(self.prev_point.y()), int(self.pixmap.width()), int(self.prev_point.y()))
2. 修改 labelImg.py 文件(预防滚动闪退)
在高版本 Python 中,滚动鼠标滚轮时也容易触发类似的 float 类型报错。建议提前修复:
找到 D:\dev\python3.12.0\Lib\site-packages\labelImg\labelImg.py 这个文件并打开。
找到第 965 行左右(通常在 scroll_request 函数内)的代码:
-
bar.setValue(bar.value() + bar.singleStep() * units)
-
将其修改为:
-
bar.setValue(int(bar.value() + bar.singleStep() * units))
-
经过以上修改有效的解决上述问题。