标注软件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 浮点数报错
相关推荐
深爱水瓶 血影S狂风8 分钟前
Linux.NET学习手记(2)
linux·学习·.net
sg_knight41 分钟前
Codex CLI 安装全攻略:macOS / Linux / Windows(WSL2)三端实战
linux·windows·macos·openai·ai编程·coding·codex
大眼、不聚光1 小时前
9.linux系统管理-ssh免密配置
linux·ssh·github
啦啦啦!1 小时前
虚拟机如何接入Codex并配置中转站(vscode插件版)
linux·vscode·ubuntu·编辑器
love530love1 小时前
Ubuntu系统通过Homebrew安装Lightpanda完整实战教程(含端口占用排坑)
大数据·linux·运维·人工智能·elasticsearch·搜索引擎
j7~1 小时前
【Linux】二十八.线程篇五《Linux多线程编程:线程同步之条件变量》---详解
linux·运维·c++·学习·条件变量·线程同步
似水এ᭄往昔1 小时前
【Linux网络编程】--UDP__SCOKE
linux·计算机网络
小张同学a.2 小时前
LAMP架构4——MySQL高可用
linux·运维·服务器·数据库·mysql·架构·负载均衡
进击切图仔2 小时前
Ubuntu 挂载 XFS 磁盘并免密读写
linux·网络·ubuntu
qetfw2 小时前
Debian Apache2 执行 Shell CGI:动态时间页面配置与验证
linux·运维·debian