标注软件labelImg在linux下鼠标滚轮闪退解决办法

标注软件labelImg在linux下一系列闪退解决办法

我的解决版本为1.8.6,其他版本应该也类似处理办法

bash 复制代码
pip show labelImg | grep Version
Version: 1.8.6
bash 复制代码
#!/bin/bash
# LabelImg 完整修复脚本
# 修复所有浮点数类型错误:滚轮缩放、鼠标拖动、图片移动等

echo "=========================================="
echo "  LabelImg 完整修复脚本"
echo "=========================================="

# !!!!!获取虚拟环境路径,这里需要修改成你自己的目录!!!!!
if [ -d "$HOME/yolo26_env" ]; then
    ENV_PATH="$HOME/yolo26_env"
elif [ -d "$HOME/.local/lib/python3.10/site-packages" ]; then
    ENV_PATH="$HOME/.local"
else
    echo " 未找到虚拟环境,请手动修改 ENV_PATH"
    exit 1
fi

CANVAS_FILE="$ENV_PATH/lib/python3.10/site-packages/libs/canvas.py"
LABELIMG_FILE="$ENV_PATH/lib/python3.10/site-packages/labelImg/labelImg.py"

echo " 虚拟环境路径: $ENV_PATH"
echo ""

# 检查文件是否存在
if [ ! -f "$CANVAS_FILE" ]; then
    echo " 找不到 canvas.py: $CANVAS_FILE"
    exit 1
fi

if [ ! -f "$LABELIMG_FILE" ]; then
    echo "找不到 labelImg.py: $LABELIMG_FILE"
    exit 1
fi

# 备份原文件
echo "备份原文件..."
cp "$CANVAS_FILE" "${CANVAS_FILE}.bak.$(date +%Y%m%d_%H%M%S)"
cp "$LABELIMG_FILE" "${LABELIMG_FILE}.bak.$(date +%Y%m%d_%H%M%S)"
echo "备份完成"
echo ""

# ==========================================
# 修复 1: canvas.py 中的 drawLine (绘图线条)
# ==========================================
echo " 修复 1: canvas.py - drawLine 浮点数问题..."
sed -i 's/p\.drawLine(\([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\))/p.drawLine(int(\1), int(\2), int(\3), int(\4))/g' "$CANVAS_FILE"
echo "   drawLine 修复完成"

# ==========================================
# 修复 2: canvas.py 中的 drawRect (绘制矩形)
# ==========================================
echo " 修复 2: canvas.py - drawRect 浮点数问题..."
sed -i 's/p\.drawRect(\([^,]*\), \([^,]*\), \([^,]*\), \([^)]*\))/p.drawRect(int(\1), int(\2), int(\3), int(\4))/g' "$CANVAS_FILE"
echo "    drawRect 修复完成"

# ==========================================
# 修复 3: canvas.py 中的鼠标拖动 pan 信号
# ==========================================
echo "修复 3: canvas.py - 鼠标拖动 pan 信号..."
# 方法1: 精确匹配
sed -i 's/delta_x = pos\.x() - self\.pan_initial_pos\.x()/delta_x = int(pos.x() - self.pan_initial_pos.x())/' "$CANVAS_FILE"
sed -i 's/delta_y = pos\.y() - self\.pan_initial_pos\.y()/delta_y = int(pos.y() - self.pan_initial_pos.y())/' "$CANVAS_FILE"
# 方法2: 备用匹配(如果上面没匹配到)
sed -i 's/delta_x = pos\.x() - self\.pan_initial_pos\.x()/delta_x = int(pos.x() - self.pan_initial_pos.x())/g' "$CANVAS_FILE"
sed -i 's/delta_y = pos\.y() - self\.pan_initial_pos\.y()/delta_y = int(pos.y() - self.pan_initial_pos.y())/g' "$CANVAS_FILE"
echo "  pan 信号修复完成"

# ==========================================
# 修复 4: canvas.py 中的 wheelEvent 滚轮信号
# ==========================================
echo "修复 4: canvas.py - 滚轮信号..."
sed -i 's/self\.scrollRequest\.emit(v_delta, Qt\.Vertical)/self.scrollRequest.emit(int(v_delta), Qt.Vertical)/' "$CANVAS_FILE"
sed -i 's/self\.scrollRequest\.emit(h_delta, Qt\.Horizontal)/self.scrollRequest.emit(int(h_delta), Qt.Horizontal)/' "$CANVAS_FILE"
echo " 滚轮信号修复完成"

# ==========================================
# 修复 5: labelImg.py 中的 scroll_request
# ==========================================
echo "修复 5: labelImg.py - scroll_request 函数..."
sed -i 's/bar\.setValue(bar\.value() + bar\.singleStep() \* units)/bar.setValue(bar.value() + int(bar.singleStep() * units))/' "$LABELIMG_FILE"
echo "  scroll_request 修复完成"

# ==========================================
# 修复 6: labelImg.py 中的 zoom_request
# ==========================================
echo "修复 6: labelImg.py - zoom_request 函数..."
sed -i 's/self\.add_zoom(scale \* units)/self.add_zoom(int(scale * units))/' "$LABELIMG_FILE"
sed -i 's/h_bar\.setValue(new_h_bar_value)/h_bar.setValue(int(new_h_bar_value))/' "$LABELIMG_FILE"
sed -i 's/v_bar\.setValue(new_v_bar_value)/v_bar.setValue(int(new_v_bar_value))/' "$LABELIMG_FILE"
echo " zoom_request 修复完成"

# ==========================================
# 修复 7: labelImg.py 中的 set_zoom
# ==========================================
echo "修复 7: labelImg.py - set_zoom 函数..."
sed -i 's/self\.zoom_widget\.setValue(value)/self.zoom_widget.setValue(int(value))/' "$LABELIMG_FILE"
echo " set_zoom 修复完成"

# ==========================================
# 修复 8: labelImg.py 中的 setValue 全部转 int
# ==========================================
echo " 修复 8: labelImg.py - 所有 setValue 转整数..."
sed -i 's/\([a-z_]*\.setValue(\)\([^)]*\))/\1int(\2))/g' "$LABELIMG_FILE"
echo " 所有 setValue 修复完成"

# ==========================================
# 修复 9: canvas.py 中的 setValue 全部转 int
# ==========================================
echo "修复 9: canvas.py - 所有 setValue 转整数..."
sed -i 's/\([a-z_]*\.setValue(\)\([^)]*\))/\1int(\2))/g' "$CANVAS_FILE"
echo " canvas setValue 修复完成"

echo ""
echo "=========================================="
echo "所有修复完成!"
echo "=========================================="
echo ""
echo "请重启 LabelImg 测试:"
echo "  labelImg"

脚本功能说明

修复项 解决的问题
drawLine 绘制辅助线时闪退
drawRect 绘制矩形框时闪退
pan 信号 鼠标拖动移动图片不生效
wheelEvent 滚轮信号 滚轮滚动时闪退
scroll_request 滚动条滚动时闪退
zoom_request 缩放时闪退
set_zoom 设置缩放值时闪退
所有 setValue 任何 setValue 浮点数报错
相关推荐
李彦亮老师(本人)2 小时前
Rocky Linux 9.x 新特性详解
linux·运维·服务器·centos·rocky linux
NiKick2 小时前
在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)
linux·服务器·网络
扛枪的书生5 小时前
包管理器用法速查
linux
biubiubiu07065 小时前
Linux 中 `source` 和 `systemctl daemon-reload` 的区别与踩坑点
linux·运维·服务器
Lugas Luo5 小时前
SATA 硬盘识别延时:协议层与内核机制分析
linux·嵌入式硬件
lit_wei5 小时前
【Linux的以太网驱动的收发流程比较】
linux
ringking1235 小时前
Linux 主机通过 Wi-Fi 上网,并将网络通过网口共享给交换机下游设备
linux·服务器·网络
123过去6 小时前
rcracki_mt使用教程
linux·网络·测试工具
海参崴-6 小时前
【Linux 项目自动化构建工具 -- make/makefile && 版本管理 Git 的使用&&第一个程序
linux·git·自动化