最近正再应用Wox,这个软件还挺高效的,而且还能本人编写一些插件,这里打算本人写点插件用用.
Wox官网
Plugin (wox.one)插件,此外官网也提供了编写文档,编写插件 · GitBook (wox.one)提供Python和C#两种优良的语言编写计划。我这里就应用Python写了.
首先须要做的是创立新的虚拟环境作隔离,个别应用python自带的venv
或者virtualenv
,当然也有比拟新的pipenv
和被认为比拟重的Anaconda
,后两者也是包管理器,性能比拟多。
以下是创立虚拟环境的代码示例:
应用 virtualenv:
# 装置 virtualenvpip 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 requestsfrom bs4 import BeautifulSoupimport webbrowserfrom 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后的响应。
所以query
和context_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)用一个元组接管.
总结
- Python编写插件相干材料比拟少,C#要多一点
- 能够参考这个文件的代码,还是不错的Wox/Plugins/HelloWorldPython at master · Wox-launcher/Wox · GitHub
- 能够看看我的翻译插件,反对收费中英互译,也反对百度的有肯定收费额度的API翻译,反对多种语言
参考文献
- 要不咱们还是用回 virtualenv/venv 和 pip 吧
- Wox/wox.py at master · Wox-launcher/Wox · GitHub
本文由mdnice多平台公布