使用Python编写Wox插件

article/2025/11/6 5:10:31

最近正再使用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

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

项目结构

可以看看官方案例以及其他插件的目录结构

image-20230520114456394
image-20230520114456394

在创建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
        }
      }
image-20230521171823745
image-20230521171823745

其中,拿一个翻译插件来说,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

这是我写的部分代码,可以看到返回了一个列表,展示出来就是下面样子的

image-20230521172551777
image-20230521172551777

可以通过显示项目的方法debug.

响应方法

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

在返回的项目中,JsonRPCAction的method就填方法名,可以写在一个类中,可以使用WoxAPI改变query也就是搜索的字符串,此外还有其他方法,注意,我测试的发现show_msg已经无法正常使用了

image-20230521173212739

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

image-20230521174809680
image-20230521174809680

总结

  1. Python编写插件相关资料比较少,C#要多一点
  2. 可以参考这个文件的代码,还是不错的 Wox/Plugins/HelloWorldPython at master · Wox-launcher/Wox · GitHub
  3. 可以看看我的翻译插件,支持免费中英互译,也支持百度的有一定免费额度的API翻译,支持多种语言 image-20230521173938835 image-20230521174103179

参考文献

  1. [要不我们还是用回 virtualenv/venv 和 pip 吧 ](https://zhuanlan.zhihu.com/p/81568689#:~:text=virtualenv :Python 虚拟环境管理工具。 venv :Python 标准库内置的虚拟环境管理工具,Python 3.3 加入,Python,开始作为管理虚拟环境的推荐工具,用法类似 virtualenv。 如果你使用 Python 3,推荐使用 venv 来替代 virtualenv。)
  2. Wox/wox.py at master · Wox-launcher/Wox · GitHub

本文由 mdnice 多平台发布


http://chatgpt.dhexx.cn/article/8nEKOO3b.shtml

相关文章

Wox插件之程序员不安装会死系列

Wox 安装 在操作系统上,可快速启动、计算、查找程序、文件等,同时也提供了一系列插件,使用起来非常的方便。默认启动 Wox 快捷键 Alt Space,当然你也可以自己设置自己喜欢的快捷键 Wox下载地址:下载地址 不安装会…

快速搜索Wox工具之Everything Client没有运行报错,解决办法!

一直在用的一款快速搜索神器——Wox,但是在使用过程中出现一个报错! 报错如下: Everything Client 没有运行令我很烦,百度了一下,试了很多方法,还是不能发挥它的最大功效。 由于我是一个好学的人&#xff…

Wox - 开源免费强大的快捷启动器辅助工具,快速高效率打开软件/搜索文件!

在日常的电脑操作中,我们常常花很多时间重复做着一件事情:退回桌面/开始菜单->寻找软件图标->点击启动。但如果你喜欢高效的键盘操作,那么你需要一款好用的快速启动器软件。 我们曾介绍过 RunZ、Launchy、AltRun、Executor、Alfred 等…

自己做一个wox主题

wox WoX是运行正常的Windows启动器。它是Alfred和Launchy的替代方案。如果需要长名称,可以将其称为Windows omni-eXecutor。 如何替换样式 众所周知,wox自带主题比较丑,所以可以自己写 打开wox配置目录C:\Users\{{user_name}}\AppData\Lo…

wox开机自启_Wox具有一切支持的Windows启动器

Wox是用于Windows的由插件驱动的启动器,支持文件和Web搜索以及其他操作,您都可以通过点击程序的热键来访问它们。 它的核心功能类似于Windows上的其他文件启动器(如Launchy)所提供的功能。您可以使用快捷键Alt-Space调出程序的提示,并且可以立…

Everything+Wox介绍和使用方式

EverythingWox介绍和使用方式 相信很多人都会遇到这种情况,文件夹都放在不同的磁盘中,想要寻找会忘记文件夹存、图片等放的位置,这时候很多人都会运用Windows自带的搜索引擎搜索文件夹,而自带的搜索功能速度慢的感人,…

windows装机必备:文件查找神器Everything + Wox

问题背景 我们通常也不会花费大量地时间去整理文件,这导致我们想使用某个文件时难以找到,而Windows 操作系统不会给文件建立索引,这使得我们使用Windows自带的搜索功能时要消耗大量的时间。 比如我现在要在我的电脑上查找名为“学生成绩.tx…

WOX快速搜索

WOX wox和mac上的Aflred类似,虽然在功能上稍有逊色,但是还是可以给我们使用windows电脑带来很多福利。首先你不需要在桌面放一堆应用软件的快捷方式,桌面可以非常干净整洁,想要打开某个应用只需要叫出wox,输软件首字母…

WOX配置常用搜索引擎

我下载的Wox-1.4.1196自带了百度搜索的触发关键字。altspace唤出wox后,输“bd 搜索词”即可通过默认浏览器打开该搜索词的百度搜索网页。但是只有渣度怎么能够呢?通过如下方法可添加大陆其他搜索的触发关键字: 一些我常用的搜索的URL&#xf…

Wox主题样式基础的自定义

2020年10月21日更新: 从最开始用了几天Wox,然后down了源码,看完一遍之后就已经没在用了。一直用的windows10的winS的搜索功能,把一些常用的目录配置到搜索里面,用起来还凑合。 最近发现一款官方出的工具:microsoft/PowerToys 还有…

Wox+Everything结合使用

昨天晚上在b站看到一个视频,说你工作效率提高1400%,推荐了10款软件,这其中就是一款。 Tips: 如果你需要用到文件的快速搜索、打开功能,需要预先安装 Everything , 这里是 Everythig 的下载地址。 下载地址 Wox 的官方下…

Wox自制主题 - Material

很喜欢用Wox,主要用来搜索本地文件和翻译。为了和桌面主题(我的鼠标的主题是Material的)融合,美观一点,自己制作了两个皮肤。有需要的可以拿去用。 推荐使用utools,完全可以替代Wox了,更好用更…

自制Alfred/Wox插件推荐

最近上手Alfred的使用,日常工作中存在很多需要高频执行的连续性动作,将这一系列动作封装成Workflow,通过命令触发,对提升效率确有很大帮助。 自己封装了一些简单的Workflow,这里分享出来。有Alfred/Wox框架的支撑&…

效率神器----WOX

想必用过mac的人都会知道一款效率神器Alfred,可快速启动、计算、查找等,使用起来非常的方便。Win上面也有类似的效率神器,比如Listary和WOX。 今天介绍的神器是WOX,这个真的算是每天必用的一款软件。用起来非常的舒服&#xff0c…

Wox使用教程

参考链接: Windows上的效率启动器Wox,教你如何优雅地使用电脑 实用工具 Wox Windows 上的 Alfred,免费开源的效率启动器:Wox 今天分享一个我一直在用,并且让我爱不释手的一个工具软件,Wox。 Wox 是一款国…

Wox + Everything = 效率神器(附下载链接)

文章目录 1 Everythign2 Wox3 下载链接4 使用技巧 1 Everythign 想必大家都知道,Everythign是一款基于名称快速定位文件和文件夹的轻量级软件,比Windows的搜索效率强大数倍。 Everything 与另一款软件 Wox 可以做到无缝衔接,提升使用体验。 …

详解Wox

Wox 是一款国产开源免费的软件快捷启动工具,它可以快速搜索并打开你电脑上的程序、文件、或是查词翻译、网站查找等其他操作,同时还支持插件安装。 Tips: 如果你需要用到文件的快速搜索、打开功能,需要预先安装 Everything , 这里…

Windows(Wox) 办公提效工具

Wox简介 Wox 是Windows平台上无可争议的效率启动神器,除了快速执行启动应用、计算公式、搜索一切之外,还有强大的可扩展性,拥有众多的功能扩展插件。 你可以在 Wox 官网 免费下载 Wox。同时,Wox 也是一个开源项目,你可…

「win工具」Win 上好用的效率神器Wox

一、Wox 快速启动 官方介绍:Windows上功能齐全的启动器,可在您键入内容时访问程序和Web内容。从此以后,你的工作效率会更高。Wox是免费使用的,并且在Github上开源! 简单来讲,Wox就是一款快速启动工具&#…

ES6 闭包

闭包 一、变量作用域 变量根据作用域的不同分为两种:全局变量和局部变量。 函数内部可以使用全局变量。函数外部不可以使用局部变量。当函数执行完毕,本作用域内的局部变量会销毁。 二、闭包的概念 **闭包函数:**声明一个在函数中的函数…