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
相关产品推荐
相关产品推荐

