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 相关文章推荐
python3中dict(字典)的使用方法示例
Mar 22 Python
Python的语言类型(详解)
Jun 24 Python
python dlib人脸识别代码实例
Apr 04 Python
Python 私有化操作实例分析
Nov 21 Python
GDAL 矢量属性数据修改方式(python)
Mar 10 Python
使用Django实现把两个模型类的数据聚合在一起
Mar 28 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
python dict如何定义
Sep 02 Python
django注册用邮箱发送验证码的实现
Apr 18 Python
解决numpy和torch数据类型转化的问题
May 23 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
May 28 Python
浅谈Python数学建模之数据导入
Jun 23 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
PHPLog php 程序调试追踪工具
2009/09/09 PHP
将一维或多维的数组连接成一个字符串的php代码
2010/08/08 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
jQuery实现新消息在网页标题闪烁提示
2015/06/23 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
2018/07/05 Javascript
微信小程序与公众号卡券/会员打通的问题
2019/07/25 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
Python中exit、return、sys.exit()等使用实例和区别
2015/05/28 Python
Python的Django中django-userena组件的简单使用教程
2015/05/30 Python
怎样使用Python脚本日志功能
2016/08/14 Python
Python实现计算两个时间之间相差天数的方法
2017/05/10 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
每天迁移MySQL历史数据到历史库Python脚本
2018/04/13 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
哪些是python中web开发框架
2020/06/17 Python
python中的测试框架
2020/11/13 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
高等教育专业自荐信范文
2014/03/26 职场文书
电子信息专业应届生自荐信
2014/06/04 职场文书
pytorch实现ResNet结构的实例代码
2021/05/17 Python
详解Redis基本命令与使用场景
2021/06/01 Redis