0

I am developing a Calibre's plugin and I want to store user settings (e.g. if the plugin should make a post-import conversion from one format to another - in my case: pdf to djvu).

How can I store user settings? Does Calibre have a build-in method to do this?

For example I have a dictionary prefs_org_dict with keys and values representing preferences set by an user. How can I store this data reliably and read it later?

4

1 回答 1

1

手册建议的方法是创建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

但是这种方法有一些注意事项:

  1. 设置文件的名称。释义手册:

    请记住,此名称(即'plugins/PLUGINNAME')也在全局名称空间中,因此请使其尽可能唯一。您应该始终在配置文件名前加上plugins/,以确保您不会意外破坏 calibre 配置文件。

    将任何内容保存到此对象后,您可以PLUGINNAME.json在 Calibre 插件的配置文件夹中看到您的文件(对于 Windows: )(您可以使用:和附加%APPDATA%\calibre\plugins以编程方式获取此路径)。from calibre.utils.config import config_dir/plugins

  2. 默认设置。

    prefs.defaults是一个字典,如果给定的键在您的对象中不存在,则返回该值。prefs因此,您可以为插件的设置创建一些默认值,例如:

    prefs.defaults['postimport'] = False
    

    主要问题是当您尝试使用其他 dict 方法时.values().items()或者.iteritems()它们返回 "real" prefs,而不是默认值,即对于我们的示例,如果prefs['postimport']没有进一步定义:

    >>> prefs.defaults['postimport']
    False
    >>> prefs.defaults.items()
    [('postimport', False)]
    >>> prefs['postimport']
    False
    >>> prefs.items()
    []
    
  3. 提交嵌套字典。

    如果您想将JSONConfig对象用作真正的.json存储,您可能需要使用嵌套字典。例如:

    prefs['pdf'] = {}
    prefs['pdf']['convert'] = True
    

    但是,如果您为嵌套字典设置(或删除)值,prefs['pdf']它将不会保存到.json文件中。你必须:

    prefs.commit()
    

    将数据设置为嵌套字典后将数据保存到文件。

  4. JSON 格式的约束。

    一些 Python 特性无法转换为 JSON 格式,例如 JSON 没有元组,因此元组转换为数组。同样在 Python 中,您可以将每个可散列对象(例如元组或frozenset)作为键。JSON 只接受字符串。json.dumps

于 2017-03-30T18:20:34.580 回答