【问题标题】:How one can store user's settings in Calibre's plugin?如何将用户的设置存储在 Calibre 的插件中?
【发布时间】:2017-03-30 18:20:34
【问题描述】:
我正在开发 Calibre 的插件,我想存储用户设置(例如,如果插件应该在导入后从一种格式转换为另一种格式 - 在我的
案例:pdf 到 djvu)。
如何存储用户设置? Calibre 是否有内置方法来执行此操作?
例如,我有一个字典prefs_org_dict,其中的键和值表示用户设置的首选项。如何可靠地存储这些数据并在以后读取?
【问题讨论】:
标签:
python
python-2.7
plugins
calibre
【解决方案1】:
manual 建议的方法是创建JSONConfig 对象并在其中存储用户偏好。
基本上只是:
import os
from calibre.utils.config import JSONConfig
prefs = JSONConfig(os.path('plugins', 'PLUGINNAME'))
# JSONConfig inherits after Dict so use it as dictionary
for key, val in prefs_org_dict.iteritems():
prefs[key] = val
prefs.commit() # explanation in 3rd section of this post
但是这种方法有一些注意事项:
-
设置文件的名称。释义手册:
请记住,此名称(即'plugins/PLUGINNAME')也在全局命名空间中,因此请使其尽可能唯一。你应该总是在你的配置文件名前加上plugins/,以确保你不会意外破坏一个calibre的配置文件。
将任何内容保存到此对象后,您可以在 Calibre 插件的 config folder 中看到您的 PLUGINNAME.json 文件(对于 Windows:%APPDATA%\calibre\plugins)(您可以通过编程方式获取此路径:from calibre.utils.config import config_dir 并附加 /plugins) .
-
默认设置。
prefs.defaults 是一个字典,如果您的prefs 对象中不存在给定键,则其值为returned。因此,您可以为插件设置创建一些默认值,例如:
prefs.defaults['postimport'] = False
主要问题是当您尝试使用其他 dict 方法时,例如 .values()、.items() 或 .iteritems(),它们返回“真实”prefs,而不是默认值,即对于我们的示例,如果 prefs['postimport'] 不是进一步定义:
>>> prefs.defaults['postimport']
False
>>> prefs.defaults.items()
[('postimport', False)]
>>> prefs['postimport']
False
>>> prefs.items()
[]
-
提交嵌套字典。
如果您想将JSONConfig 对象用作真正的.json 存储,您可能需要使用嵌套字典。例如:
prefs['pdf'] = {}
prefs['pdf']['convert'] = True
但是,如果您将值设置(或删除)嵌套字典 prefs['pdf'],则将其 will not 保存到 .json 文件中。你必须:
prefs.commit()
将数据设置为嵌套字典后保存到文件。
-
JSON 格式的限制。
一些 Python 功能无法转换为 JSON 格式,例如JSON 没有元组,所以 json.dumps translates 元组到数组。同样在 Python 中,您可以将每个可散列对象(例如元组或冻结集)作为键。 JSON 只接受字符串。