Kivy图片编辑应用文件拷贝失败问题求助
Kivy图片编辑应用文件拷贝异常的解决方法
问题描述
开发基于Kivy的图片编辑应用,用plyer的filechooser选图后路径显示正常,但拷贝功能出问题:
- 往
image_work_dir目录拷贝时触发FileNotFoundError,提示目录不存在 - 往其他位置拷贝时无报错,但文件没复制成功
试过shutil、os.system()都没用,且确认有项目目录的写入权限
代码(image_editing.py)
class LayoutSelectImagePath(BoxLayout): path_to_image = StringProperty("") def select_image(self): # 文件选择器返回选中文件的列表 path_image = filechooser.open_file(title="选择图片", filters=[("图片", "*.jpg", "*.png", "*.ico", "*.bmp")]) if len(path_image) > 0: self.path_to_image = path_image[0] # UI正常显示路径 self.copy_image() def copy_image(self): file_base = open(self.path_to_image, "rb") # 读取图片文件 image_base = file_base.read() file_base.close() image_name = path.basename(self.path_to_image) # 获取图片文件名 file_to_work = open(f"image_work_dir/{image_name}", "wb") # 写入到新目录(失败) file_to_work.write(image_base) file_to_work.close()
报错信息(仅拷贝到image_work_dir时出现)
File "C:\Users\Trist\PycharmProjects\dev_image_edit\image_editing.py", line 28, in copy_image
file_to_work = open(f"image_work_dir/{image_name}", "wb") # write the image in a new image file in a new dir (NOT OK)
FileNotFoundError: [Errno 2] No such file or directory: 'image_work_dir/test.jpg'
项目目录结构
根目录dev_image_edit下包含:
image_editing.pyimage_work_dir目录- 其他Kivy相关配置/界面文件
解决步骤
1. 先检查并创建目标目录
报错的直接原因是:要么image_work_dir不存在,要么程序运行时的工作目录不是项目根目录,导致相对路径找不到。在写入前先确保目录存在:
import os from pathlib import Path def copy_image(self): # 获取当前代码文件所在目录,拼接出目标工作目录的绝对路径 work_dir = Path(__file__).parent / "image_work_dir" # 若目录不存在则创建,已存在则不做操作 work_dir.mkdir(exist_ok=True) image_name = os.path.basename(self.path_to_image) target_file_path = work_dir / image_name # 用shutil.copy2拷贝,比手动读写更可靠,还保留文件元数据 import shutil shutil.copy2(self.path_to_image, target_file_path)
2. 用绝对路径避免工作目录陷阱
相对路径image_work_dir/xxx依赖程序运行时的工作目录,如果你的IDE运行程序时的工作目录不是项目根目录,就会找不到路径。用Path(__file__).parent获取代码文件所在的目录,再拼接目标目录,就能保证路径绝对正确。
3. 替换手动文件读写为shutil
手动打开文件读写容易出现资源泄漏(比如忘记关闭文件),shutil.copy2是专门的文件拷贝工具,代码更简洁,还能处理各种边缘情况。
4. 调试路径问题(可选)
如果还是有问题,加两行打印确认路径:
print("当前工作目录:", os.getcwd()) print("目标目录绝对路径:", work_dir)
内容的提问来源于stack exchange,提问作者Tristan Casemajor
相关产品推荐
相关产品推荐

