乐趣区

关于程序员:使用Python编写Wox插件

最近正再应用 Wox,这个软件还挺高效的,而且还能本人编写一些插件,这里打算本人写点插件用用.

Wox 官网

Plugin (wox.one)插件, 此外官网也提供了编写文档,编写插件 · GitBook (wox.one)提供 Python 和 C# 两种优良的语言编写计划。我这里就应用 Python 写了.

首先须要做的是创立新的虚拟环境作隔离,个别应用 python 自带的 venv 或者 virtualenv, 当然也有比拟新的pipenv 和被认为比拟重的Anaconda,后两者也是包管理器,性能比拟多。

以下是创立虚拟环境的代码示例:

应用 virtualenv:

# 装置 virtualenv
pip install virtualenv

# 创立名为 myenv 的虚拟环境
virtualenv myenv

# 激活虚拟环境(Windows 平台)myenv\Scripts\activate.bat

# 激活虚拟环境(Linux 和 Mac 平台)source myenv/bin/activate

# 退出虚拟环境
deactivate

应用 venv:

# 创立名为 myenv 的虚拟环境
python3 -m venv myenv

# 激活虚拟环境
source myenv/bin/activate

# 退出虚拟环境
deactivate

这一步还是很重要的,环境不能乱。

我的项目构造

能够看看官网案例以及其余插件的目录构造

在创立 Wox 的时候,用户必须在插件的根目录形式一个名为 plugin.json 的文件。该文件中蕴含了该插件的一些根本信息。

plugin.json的格局如下:请在粘贴上面代码的时候移除其中的正文

重点是触发词 ActionKeyword 以及 IcoPath 插件图标,ID须要一个 32 位不与其余插件反复的随机数,本人生成即可。

{
  "ID":"D2D2C23B084D411DB66FE0C79D6C2A6H",   // 插件 ID,32 位的 UUID
  "ActionKeyword":"wpm",                     // 插件默认的触发关键字
  "Name":"WPM",                              // 插件名字
  "Description":"Wox Package Management",    // 插件介绍
  "Author":"qianlifeng",                     // 作者
  "Version":"1.0.0",                         // 插件版本,必须是 x.x.x 的格局
  "Language":"csharp",                       // 插件语言,目前反对 csharp,python
  "Website":"http://www.getwox.com",         // 插件网站或者集体网站
  "IcoPath": "Images\\pic.png",              // 插件图标,门路是绝对插件根目录的门路
  "ExecuteFileName":"PluginManagement.dll"   // 执行文件入口,如果是 C# 插件则填写 DLL 门路,如果是 pyhton 则填写 python 文件门路
}

而后就是主文件以及插件图标文件

Python 开发

Wox 自带了一个打包的 Python 及其规范库,所以应用 Python 插件的用户不用本人再装置 Python 环境。同时,Wox 还打包了 requests 和 beautifulsoup4 两个库,不便用户进行网络拜访与解析。

根底

应用 Python 开发须要有一个类继承 Wox, 留神这个货色并不需要 pip 下载,是 Wox 自带的运行时,包含 requests 和 BeautifulSoup4,而其余的第三方包须要本人下载. 下载 Wox 时有一个 full-installer 蕴含 python 解释器,本人能够设置 Python 解释器文件夹门路为环境变量,个别下载 Python 时抉择退出环境变量即可。

继承 Wox 类后要害要继承的办法是query

import requests
from bs4 import BeautifulSoup
import webbrowser
from wox import Wox,WoxAPI

#用户写的 Python 类必须继承 Wox 类 https://github.com/qianlifeng/Wox/blob/master/PythonHome/wox.py
#这里的 Wox 基类做了一些工作,简化了与 Wox 通信的步骤。class Main(Wox):

    def request(self,url):
    #如果用户配置了代理,那么能够在这里设置。这里的 self.proxy 来自 Wox 封装好的对象
    if self.proxy and self.proxy.get("enabled") and self.proxy.get("server"):
      proxies = {"http":"http://{}:{}".format(self.proxy.get("server"),self.proxy.get("port")),
        "https":"http://{}:{}".format(self.proxy.get("server"),self.proxy.get("port"))}
      return requests.get(url,proxies = proxies)
    else:
      return requests.get(url)

    #必须有一个 query 办法,用户执行查问的时候会主动调用 query 办法
    def query(self,key):
    r = self.request('https://news.ycombinator.com/')
    bs = BeautifulSoup(r.text)
    results = []
    for i in bs.select(".comhead"):
      title = i.previous_sibling.text
      url = i.previous_sibling["href"]
      results.append({
        "Title": title ,
        "SubTitle":title,
        "IcoPath":"Images/app.ico",
        "JsonRPCAction":{
          #这里除了自已定义的办法,还能够调用 Wox 的 API。调用格局如下:Wox.xxxx 办法名
          #办法名字能够从这里查阅 https://github.com/qianlifeng/Wox/blob/master/Wox.Plugin/IPublicAPI.cs 间接同名办法即可
          "method": "openUrl",
          #参数必须以数组的模式传过来
          "parameters":[url],
          #是否暗藏窗口
          "dontHideAfterAction":True
        }
      })

    return results

    def openUrl(self,url):
    webbrowser.open(url)
    WoxAPI.change_query(url)

#以下代码是必须的
if __name__ == "__main__":
Main()

下面这个例子就很典型,每次在 Wox 中输出就会调用 query 办法, 其须要返回一个列表,列表中每一项内容如下

{
        "Title": title ,
        "SubTitle":title,
        "IcoPath":"Images/app.ico",
        "JsonRPCAction":{
          "method": "openUrl",  
          "parameters":[url],
          "dontHideAfterAction":True
        }
      }

其中, 拿一个翻译插件来说,Title 就是要点,SubTitle 就是翻译后果,icoPath 是右边图标的门路,我测试了必须应用本地文件,而 JsonRPCAction 就是按 Enter 键或鼠标左击后的响应,method 就是触发的办法,能够本人写,也能够用 wox.pyWox/wox.py at master · Wox-launcher/Wox · GitHub 中的 WoxAPI 办法,parameters 就是参数,要求传入一个列表.dontHideAfterAction示意点击之后 Wox 会不会暗藏.

此外还有个有意思的办法就是context_menu

def context_menu(self, data):
    """optional context menu entries for a result"""
    return []

就是鼠标右击或者 Shift+Enter 后的响应。

所以 querycontext_menu返回的后果就是展现的后果我的项目。

错误处理

日志

像对于这种插件的开发集体认为是比拟累的,debug 比拟麻烦, 不能在终端间接显示,不像个别的客户端或者 Web 开发,所以日志还是很重要的,次要应用 Python 自带的 logging 模块.

# 日志记录
class Logger:
    def __init__(self):
        filename = os.path.join(os.path.dirname(__file__), 'log.txt')
        logging.basicConfig(level=logging.DEBUG, filename=filename, filemode='a',
                            format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
        self.logger = logging.getLogger()

    def debug(self, msg):
        self.logger.debug(msg)

    def info(self, msg):
        self.logger.info(msg)

    def error(self, msg):
        self.logger.error(msg)

应用时初始化 Logger, 再掉用实例办法输入信息到文件.

显示我的项目

Wox 插件机制叫做 JSON-RPC 2.0 Specification (jsonrpc.org), 利用这种办法将要展现的信息发给 Wox 并显示进去.

def query(self, key):
    self.results = []
    logger = Logger()
    logger.info("-------------info--------------")

    args = key.split()
    length = len(args)

    if length == 0:
        self.results.append(self.add_item("有道智云翻译(正在开发中)", "须要配置 key", 'Images/zhiyun.png', "configyoudao", "zy"))
        self.results.append(self.add_item("应用有道翻译收费版本", "暂只反对中英互译", 'Images/youdao.png', "freetrans", "yd"))
        self.results.append(self.add_item("应用百度翻译", "须要配置 key", 'Images/bd.png', "configbaidu", "bd"))
        self.results.append(self.add_item("重载插件", "从新加载插件", 'Images/pic.jpg', "reload"))
        return self.results

    return self.results

这是我写的局部代码,能够看到返回了一个列表,展现进去就是上面样子的

能够通过显示我的项目的办法 debug.

响应办法

def openUrl(self, url):
    webbrowser.open(url)
    WoxAPI.change_query(url, False)

在返回的我的项目中,JsonRPCAction的 method 就填办法名, 能够写在一个类中,能够应用 WoxAPI 扭转 query 也就是搜寻的字符串,此外还有其余办法,留神,我测试的发现 show_msg 曾经无奈失常应用了

<img src=”https://s2.loli.net/2023/05/21/kwTv5QKbJtL716S.png” alt=”image-20230521173212739″ style=”zoom:50%;” />

JsonRPCAction的 parameters 传入的列表就对应 method 中的参数,比方传 [1,2], 而 method 中就能够应用 method(a,b) 来接管, 当然也能够应用 method(*para)用一个元组接管.

总结

  1. Python 编写插件相干材料比拟少,C# 要多一点
  2. 能够参考这个文件的代码, 还是不错的 Wox/Plugins/HelloWorldPython at master · Wox-launcher/Wox · GitHub
  3. 能够看看我的翻译插件, 反对收费中英互译, 也反对百度的有肯定收费额度的 API 翻译,反对多种语言

参考文献

  1. 要不咱们还是用回 virtualenv/venv 和 pip 吧
  2. Wox/wox.py at master · Wox-launcher/Wox · GitHub

本文由 mdnice 多平台公布

退出移动版