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

GIMP Python-Fu:如何将文件对话框默认目录设为最后保存图像路径

正规实现GIMP插件保存对话框默认打开上次保存目录

核心思路

GIMP本身提供了持久化记录文件操作路径的机制,无需手动修改image.filename或遍历图像列表,以下是两种合规的实现方案:


方案1:使用GIMP全局配置记录路径

GIMP内置了插件路径配置项,可直接读取和更新上次保存的目录:

import os
import gtk
from gimpfu import *

def your_save_plugin(image, drawable):
    # 读取GIMP记录的最后保存目录
    last_save_dir = gimp.settings.get("/plug-ins/last-save-directory")
    # 无记录时 fallback 到桌面
    if not last_save_dir or not os.path.isdir(last_save_dir):
        last_save_dir = os.path.expanduser("~/Desktop")
    
    # 创建文件选择对话框
    chooser = gtk.FileChooserDialog(title="Save as...",
                                    action=gtk.FILE_CHOOSER_ACTION_SAVE,
                                    buttons=(gtk.STOCK_SAVE, gtk.RESPONSE_OK,
                                             gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
    chooser.set_do_overwrite_confirmation(True)
    # 设置默认打开目录
    chooser.set_current_folder(last_save_dir)
    
    response = chooser.run()
    filename = chooser.get_filename()
    chooser.destroy()
    
    if response == gtk.RESPONSE_OK and filename:
        # 执行保存操作
        pdb.file_jpeg_save(image, drawable, filename, filename, 0.9, 0, 0, 0, "", 2, 1, 0, 0)
        # 更新GIMP全局配置中的最后保存目录
        gimp.settings.set("/plug-ins/last-save-directory", os.path.dirname(filename))
        # 正常更新当前图像的filename属性
        image.filename = filename
        image.clean_all()

方案2:用GIMP持久化存储自定义路径

如果需要独立于GIMP全局配置的插件专属存储,可使用pdb的持久化数据API:

import os
import gtk
from gimpfu import *

def your_save_plugin(image, drawable):
    # 从GIMP持久化存储读取插件专属的上次保存目录
    last_save_dir = pdb.gimp_get_data("your-plugin-last-save-dir")
    # 无记录时 fallback 到桌面
    if not last_save_dir or not os.path.isdir(last_save_dir):
        last_save_dir = os.path.expanduser("~/Desktop")
    
    # 创建文件选择对话框并设置默认目录
    chooser = gtk.FileChooserDialog(title="Save as...",
                                    action=gtk.FILE_CHOOSER_ACTION_SAVE,
                                    buttons=(gtk.STOCK_SAVE, gtk.RESPONSE_OK,
                                             gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
    chooser.set_do_overwrite_confirmation(True)
    chooser.set_current_folder(last_save_dir)
    
    response = chooser.run()
    filename = chooser.get_filename()
    chooser.destroy()
    
    if response == gtk.RESPONSE_OK and filename:
        pdb.file_jpeg_save(image, drawable, filename, filename, 0.9, 0, 0, 0, "", 2, 1, 0, 0)
        # 将新目录存入插件专属的持久化存储
        pdb.gimp_set_data("your-plugin-last-save-dir", os.path.dirname(filename))
        image.filename = filename
        image.clean_all()

临时方案的问题

  • 遍历并清除所有图像的filename会破坏GIMP原生的文件跟踪逻辑,可能导致"重新保存"等功能异常
  • 依赖image.filename无法保证获取的是最后一次保存的路径,可能拿到任意一个已保存图像的路径

注意事项

  • 必须导入gimpfu模块,gimp.settings和pdb.gimp_get_data()均依赖该模块
  • 方案1的配置路径可自定义(比如/plug-ins/your-plugin-name/last-save-dir),避免与其他插件冲突
  • 两种方案都会在GIMP重启后保留路径,稳定性远高于临时方案

内容的提问来源于stack exchange,提问作者noirhor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:55:32