You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:27:03