如何在Calibre的插件中存储用户的设置?

时间:2017-03-30 18:20:35

标签: python python-2.7 plugins calibre

我正在开发一个Calibre的插件,我想存储用户设置(例如,如果插件应该从一种格式转换到另一种格式 - 在我的 案例:pdfdjvu)。

如何存储用户设置? Calibre是否有内置方法来执行此操作?

例如,我有一个字典prefs_org_dict,其中的键和值表示用户设置的首选项。如何可靠地存储这些数据并在以后阅读?

1 个答案:

答案 0 :(得分: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

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

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

      

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

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

  2. 默认设置。

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

    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'],则will not将保存到.json文件。你必须:

    prefs.commit()
    

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

  4. JSON格式的约束。

    一些Python功能无法转换为JSON格式,例如JSON没有元组,所以json.dumps translates元组到数组。同样在Python中,您可以将每个可清除对象(例如元组或冻结集)作为键。 JSON只接受字符串。