python实现划词翻译


Posted in Python onApril 23, 2020

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

一、使用逻辑

由于我是看PDF文档,用的是一款轻量级的PDF阅读器(SumatraPDF),这款阅读器只有5M,但是阅读很舒服很流畅,渲染也很到位。但是没有其他阅读器有许多强大功能,比如说划词翻译。

我的想法是一旦发现我复制就可以在当前鼠标位置显示一个翻译结果框。基于这个想法,我一开始准备使用MFC编写,因为MFC能够轻易获得系统消息,钩子调用十分简单。可是我把检测复制,显示文本框都做好的时候,发现一个悲伤的事实,c++的http库实在是不怎么样,竟然无法访问http://地址,经过一晚的尝试——失败,这才打算使用python。???锣乱淮蠖眩?蚁衷诎盐业穆呒?迪掳伞?/p>

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   #定时器,减少占用

三、代码实现

我这里先定义了三个函数,方便后面实现功能,下面有详细解释和代码

#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()))

主程序

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该是最好的胶水了,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 相关文章推荐
Python天气预报采集器实现代码(网页爬虫)
Oct 07 Python
Python操作CouchDB数据库简单示例
Mar 10 Python
在Python中操作字典之update()方法的使用
May 22 Python
详解使用python crontab设置linux定时任务
Dec 08 Python
Python编程之event对象的用法实例分析
Mar 23 Python
python 日期操作类代码
May 05 Python
解决python报错MemoryError的问题
Jun 26 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
Feb 26 Python
python实现小世界网络生成
Nov 21 Python
python 正则表达式参数替换实例详解
Jan 17 Python
Python变量作用域LEGB用法解析
Feb 04 Python
python爬虫scrapy基本使用超详细教程
Feb 20 Python
Python程序语言快速上手教程
Jul 18 #Python
python 图片验证码代码分享
Jul 04 #Python
Python查询Mysql时返回字典结构的代码
Jun 18 #Python
python 实现堆排序算法代码
Jun 05 #Python
python 实现归并排序算法
Jun 05 #Python
python 实现插入排序算法
Jun 05 #Python
python 算法 排序实现快速排序
Jun 05 #Python
You might like
深入理解PHP原理之异常机制
2010/08/21 PHP
php 数组动态添加实现代码(最土团购系统的价格排序)
2011/12/30 PHP
解析PHP将对象转换成数组的方法(兼容多维数组类型)
2013/06/21 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
php检查字符串中是否有外链的方法
2015/07/29 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
解析URI与URL之间的区别与联系
2013/11/22 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
使用javascript实现有效时间的控制,并显示将要过期的时间
2014/01/02 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
微信小程序自定义联系人弹窗
2020/05/26 Javascript
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python增加矩阵维度的实例讲解
2018/04/04 Python
Python离线安装PIL 模块的方法
2019/01/08 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
Python流程控制 if else实现解析
2019/09/02 Python
python设置环境变量的作用整理
2020/02/17 Python
keras输出预测值和真实值方式
2020/06/27 Python
Python Pivot table透视表使用方法解析
2020/09/11 Python
python zip()函数的使用示例
2020/09/23 Python
在线服装零售商:SheIn
2016/07/22 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
违反工作纪律检讨书
2014/02/15 职场文书
推荐信模板
2014/05/09 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
2014年留守儿童工作总结
2014/12/10 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
python scrapy简单模拟登录的代码分析
2021/07/21 Python