最近因为编程,需要大量地看一些说明文档,无奈说明文档都是英文的,可把我这个半桶水折腾死了,太多词汇不知道,一个个复制翻译太麻烦了。于是我根据自己的需要,用python写了一个划词翻译。

一:使用逻辑

由于我是看PDF文档,用的是一款轻量级的PDF阅读器(SumatraPDF),这款阅读器只有5M,但是阅读很舒服很流畅,渲染也很到位。但是没有其他阅读器有许多强大功能,比如说划词翻译。
我的想法是一旦发现我复制就可以在当前鼠标位置显示一个翻译结果框。基于这个想法,我一开始准备使用MFC编写,因为MFC能够轻易获得系统消息,钩子调用十分简单。可是我把检测复制,显示文本框都做好的时候,发现一个悲伤的事实,c++的http库实在是不怎么样,竟然无法访问http://地址,经过一晚的尝试——失败,这才打算使用python。啰啰嗦嗦一大堆,我现在把我的逻辑说下吧。

二:需要引用的库

因为要联网所以需要urllib,解析网页需要json,读取剪切板数据需要win32clipboard,获得当前鼠标信息用PyMouse,生成文本框Tkinter,定时器time。python为什么强大,就在于集成库的易用性和多样性,有什么需要就pip install 装就行,这点比c++强太多了。

import urllib #http连接需要用到
import json  #解析网页数据用
import win32clipboard as wc #读取剪切板数据
from pymouse import PyMouse #获得当前鼠标信息
import Tkinter         #自带的GUI库,生成文本框
import time          #定时器,减少占用

三:代码实现

  1. 我这里先定义了三个函数,方便后面实现功能,下面有详细解释和代码
#PyMouse得到的是2维字符串,但是tkinter生成窗体时需要的是类似(100*100+x+y)的字符串,100*100是窗口大小,xy是坐标点。
def transMousePosition():m = PyMouse()return "100x100+"+str(m.position()[0])+"+"+str(m.position()[1])
#获得剪切板数据
def getCopyText():wc.OpenClipboard()copy_text = wc.GetClipboardData()wc.CloseClipboard()return copy_text
#返会是否有新的复制数据,cmp函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。
def newCopyData():return cmp(currentData,str(getCopyText()))
  1. 主程序
if __name__ == '__main__':req_url = 'http://fanyi.youdao.com/translate'  # 创建连接接口,这里是有道词典的借口# 创建要提交的数据currentData=str(getCopyText())Form_Date = {}Form_Date['doctype'] = 'json'while 1:if newCopyData():currentData=str(getCopyText())#取得当前剪切板数据Form_Date['i'] = currentData # 传递数据data = urllib.urlencode(Form_Date).encode('utf-8') #数据转换response = urllib.urlopen(req_url, data) #提交数据并解析html = response.read().decode('utf-8')  #服务器返回结果读取translate_results = json.loads(html)  #以json格式载入translate_results = translate_results['translateResult'][0][0]['tgt']  # json格式调取position=transMousePosition()#取得当前鼠标位置top = Tkinter.Tk()#窗口初始化top.wm_attributes('-topmost',1)#置顶窗口top.geometry(position)#指定定位生成指定大小窗口e=Tkinter.Text()#生成文本框部件e.insert(1.0,translate_results)#插入数据e.pack()#将部件打包进窗口top.mainloop()# 进入消息循环currentData=str(getCopyText())time.sleep(1)

到此,我们划词翻译程序就已经完成了,虽然不太美观。而且美中不足的是我没有想到一个好的办法退出程序,相当于一个死循环在里面,只有强行退出,不知道谁有好办法能够解决这个问题,如果有,请和我联系ltyplay@gmail.com

总结

如果要实现什么功能,python该是最好的胶水了,c++的http库实在是太坑了,浪费我好多小时。下面源代码附上,给大家参考

# -*- coding: utf-8 -*-
"""
Created on Sat Aug 11 08:24:48 2018@author: ltengy
"""
import urllib #http连接需要用到
import json  #解析网页数据用
import win32clipboard as wc #读取剪切板数据
from pymouse import PyMouse #获得当前鼠标信息
import Tkinter         #自带的GUI库,生成文本框
import time          #定时器,减少占用
currentData='' #PyMouse得到的是2维字符串,但是tkinter生成窗体时需要的是类似(100*100+x+y)的字符串,100*100是窗口大小,xy是坐标点。
def transMousePosition():m = PyMouse()return "100x100+"+str(m.position()[0])+"+"+str(m.position()[1])
#获得剪切板数据
def getCopyText():wc.OpenClipboard()copy_text = wc.GetClipboardData()wc.CloseClipboard()return copy_text
#返会是否有新的复制数据
def newCopyData():return cmp(currentData,str(getCopyText()))
if __name__ == '__main__':req_url = 'http://fanyi.youdao.com/translate'  # 创建连接接口,这里是有道词典的借口# 创建要提交的数据currentData=str(getCopyText())Form_Date = {}Form_Date['doctype'] = 'json'while 1:if newCopyData():currentData=str(getCopyText())#取得当前剪切板数据Form_Date['i'] = currentData # 传递数据data = urllib.urlencode(Form_Date).encode('utf-8') #数据转换response = urllib.urlopen(req_url, data) #提交数据并解析html = response.read().decode('utf-8')  #服务器返回结果读取translate_results = json.loads(html)  #以json格式载入translate_results = translate_results['translateResult'][0][0]['tgt']  # json格式调取position=transMousePosition()#取得当前鼠标位置top = Tkinter.Tk()#窗口初始化top.wm_attributes('-topmost',1)#置顶窗口top.geometry(position)#指定定位生成指定大小窗口e=Tkinter.Text()#生成文本框部件e.insert(1.0,translate_results)#插入数据e.pack()#将部件打包进窗口top.mainloop()# 进入消息循环currentData=str(getCopyText())time.sleep(1)

python实现划词翻译相关推荐

  1. Ubuntu 划词翻译

    在 Windows 下用 QTranslate 可以划词翻译,调用谷歌或百度翻译引擎,不需要本地词典. 在 Ubuntu 下可以自己写脚本实现一个简陋的版本. 步骤如下: 安装 xsel,sudo a ...

  2. 划词翻译脚本--AutoHotkey

      自从上次用python脚本写划词翻译脚本接触了AutoHotkey之后,就想着不调用python直接用Autohotkey实现相同的功能,由于刚接触AutoHotkey,对这个语言不是很熟悉,所以 ...

  3. ununtu20.04系统中如何划词翻译_如何高效阅读PDF外文文献,这一篇文章全搞定

    对于很多初学者而言,阅读外文文献时非常痛苦的.句型复杂.生词多以及读者本身对外文文献的排斥感,都是造成阅读障碍的主要因素. 当然,如果你学会以下小编分享的一些技巧,可能并不觉得阅读那么难熬. 首先:建 ...

  4. ubuntu20.04中安装划词翻译_教你轻松玩转免安装的网页翻译插件“有道网页翻译2.0”...

    大家在日常网页浏览中肯定多多少少都会碰到英文网站,这时候往往需要花费非常多的时候去自行理解,效率低下,又或者借助浏览器自带的翻译功能进行翻译,但又可能遇到翻译不准的情况. 现在这个问题可以解决啦!&q ...

  5. 在火狐浏览器上安装Tampermonkey和Greasy Fork和使用iciba划词翻译

    网页上都是英文,有时候翻译很不方便,为了更好的查看英文文档,安装了汉化翻译软件.话不多说开始安装步骤: 一.安装Tampermonkey 网页:Tampermonkey • Home 根据自己的火狐浏 ...

  6. 划词翻译—多种翻译平台集合体积不足1mb——QTranslate

    QTranslate是一个的免费翻译工具. 只需划词翻译,然后热键Ctrl + Q小弹窗翻译,双击ctrl在主窗口显示翻译.Ctrl + E读出翻译,Ctrl + Shift + Q用词典搜索,关键是 ...

  7. 安装侧边翻译,划词翻译,看外文论文神器,比知云还好用Edge Translate

    前言 写论文相信大家参考的大多数都是外文文献,但是想我这样英文水平不佳的小伙伴还是比较多的,所以看外文文献就很费劲.         有的小伙伴用谷歌或者百度翻译 一边复制翻译一边看, 后来用知云翻译 ...

  8. vscode翻译插件最佳搭配、翻译变量、划词翻译、中译英(提高生产效率)

    需求 假设是一个不会英语的小白,那么写出可读性强的代码必须: 有给变量自动翻译为英语的功能 要能划词翻译,从而看懂别人的代码和注释 自己代码的注释也要能中译英 插件不能快捷键冲突 插件 使用以下插件即 ...

  9. 论文阅读利器——划词翻译插件(桌面与浏览器)

    对于喜爱学习,阅读文献的各位来说,满屏的英文字母常常会磨灭我们的热情,而一般的翻译软件又有些贵,或者是根本没有很好的效果. 那么,今天,在这里介绍几款开源的插件与软件.都是可以免费使用的. 一.Edg ...

最新文章

  1. Mozilla公布WebVR API标准草案
  2. pandas使用str函数和startswith函数,筛选dataframe中不是(not start with)以特定前缀开头的数据列(selecting columns)
  3. Java互联网架构 百度云_java互联网架构师
  4. 阿里推出 PolarFS 分布式文件系统:将存储与计算分开(附论文)
  5. php面试中的问题,十个值得深思的PHP面试问题
  6. 1024到了,默默给自己点个赞!
  7. 95-110-022-源码-Env-LocalStreamEnvironment
  8. Eclipse-无法引用maven依赖的类/没有MavenDependencies/没有buildpath
  9. 【收藏】图片垂直居中的解决办法
  10. Leetcode 106.从中序与后序遍历序列重建二叉树
  11. 量化投资与信用风险机器学习建模
  12. 傅里叶变换公式及其推导【超详细!】
  13. Matlab求加权平均数,MATLAB Accumarray加权平均值
  14. 内核流浪猫流浪狗宠物领养平台H5源码
  15. bzoj3668: [Noi2014]起床困难综合症
  16. 通过Python绘制分段函数
  17. 部署Elixir项目
  18. 洛谷P2678 [NOIP2015 提高组] 跳石头
  19. excel单元格内换行
  20. PDF文件怎么插入空白页面

热门文章

  1. 28.找出字符串中第一个匹配项的下标
  2. Super expression must either be null or a function错误
  3. Matlab给图片加网格
  4. 解决docker-compose up -d 出现Client.Timeout exceeded while awaiting headers的问题(配置docker国内镜像源)
  5. Speedoffice(excel)如何快捷隐藏表格内所有空行
  6. PDPS软件:机器人TCP轨迹跟踪功能介绍与使用方法
  7. 阿里云大数据助理工程师ACA认证最新笔记(2021)
  8. File Upload(文件上传漏洞)
  9. 有了域名,怎么搭建自己的网站?
  10. 多模态信息融合多视图融合