PySimpleGUI 如何从文件浏览器选图、预览并保存到其他文件夹
这个需求完全可以实现,以下是包含图片选择、实时预览、移动到指定文件夹三个核心功能的完整可运行实现,你可以直接基于现有代码修改:
完整可运行代码
import PySimpleGUI as sg import os import shutil from PIL import Image import io import sys # 自定义预览区最大尺寸,可根据界面需求调整 PREVIEW_MAX_SIZE = (400, 400) def resize_image(image_path, max_size): """等比例缩放图片适配预览区大小""" img = Image.open(image_path) img.thumbnail(max_size) # 转成字节流供PySimpleGUI直接渲染 byte_io = io.BytesIO() img.save(byte_io, format='PNG') return byte_io.getvalue() # 界面布局定义 layout = [ [sg.Button("选择图片", key="-SELECT_IMG-"), sg.Text("未选择图片", key="-IMG_PATH-", size=(50, 1))], [sg.Image(key="-PREVIEW-", size=PREVIEW_MAX_SIZE)], [sg.Button("选择目标文件夹", key="-SELECT_FOLDER-"), sg.Text("未选择目标文件夹", key="-FOLDER_PATH-", size=(50, 1))], [sg.Button("移动图片到目标文件夹", key="-MOVE_IMG-", disabled=True)], [sg.Text("", key="-STATUS-", text_color="green")] ] window = sg.Window("图片选择迁移工具", layout) # 全局状态变量 current_img_path = "" target_folder = "" while True: event, values = window.read() if event == sg.WINDOW_CLOSED: break # 选择图片逻辑 if event == "-SELECT_IMG-": fname = sg.popup_get_file('选择图片', file_types=(("图片文件", "*.png *.jpg *.jpeg *.bmp"),), default_path='') if fname: current_img_path = fname window["-IMG_PATH-"].update(os.path.basename(fname)) # 更新预览区 preview_data = resize_image(fname, PREVIEW_MAX_SIZE) window["-PREVIEW-"].update(data=preview_data) # 已选目标文件夹则激活移动按钮 if target_folder: window["-MOVE_IMG-"].update(disabled=False) window["-STATUS-"].update("图片加载完成") # 选择目标文件夹逻辑 if event == "-SELECT_FOLDER-": folder = sg.popup_get_folder('选择目标存储文件夹') if folder: target_folder = folder window["-FOLDER_PATH-"].update(folder) # 已选图片则激活移动按钮 if current_img_path: window["-MOVE_IMG-"].update(disabled=False) window["-STATUS-"].update("目标文件夹选择完成") # 移动图片逻辑 if event == "-MOVE_IMG-": if not current_img_path or not target_folder: window["-STATUS-"].update("请先选择图片和目标文件夹", text_color="red") continue # 构造目标路径 file_name = os.path.basename(current_img_path) target_path = os.path.join(target_folder, file_name) # 重名文件自动加序号后缀,避免覆盖 counter = 1 while os.path.exists(target_path): name, ext = os.path.splitext(file_name) target_path = os.path.join(target_folder, f"{name}_{counter}{ext}") counter += 1 # 执行移动操作,如需上传到服务器,将此处shutil.move替换为你的服务端接口调用逻辑即可 try: shutil.move(current_img_path, target_path) window["-STATUS-"].update(f"图片已成功移动到: {target_path}", text_color="green") # 操作完成重置状态 current_img_path = "" window["-IMG_PATH-"].update("未选择图片") window["-PREVIEW-"].update(data=None) window["-MOVE_IMG-"].update(disabled=True) except Exception as e: window["-STATUS-"].update(f"移动失败: {str(e)}", text_color="red") window.close()
核心逻辑说明
图片预览实现
- 通过PIL读取选中的图片文件,使用
thumbnail方法等比例压缩到预设的预览区尺寸,避免撑爆界面 - 压缩后的图片直接写入内存IO流转为字节数据,不需要生成本地临时文件,直接传入PySimpleGUI的Image控件完成预览更新
图片移动/上传实现
- 本地迁移直接调用
shutil.move完成,如果要实现社交平台上传到服务器的效果,只需要将对应位置的shutil.move逻辑替换为你的服务端上传接口调用即可 - 内置重名文件自动加后缀逻辑,不会覆盖目标路径下的已有文件
- 操作完成后自动清空预览区和选中状态,支持连续操作
交互优化
- 只有同时选中图片和目标文件夹后,移动按钮才会激活,避免误操作
- 底部状态栏实时展示操作结果和异常信息,降低使用门槛
- 文件选择框限制仅可选择支持的图片格式,避免加载非图片文件报错
内容的提问来源于stack exchange,提问作者Rthirteen
相关产品推荐
相关产品推荐

