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 相关文章推荐
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
Nov 27 Python
python基础教程之循环介绍
Aug 29 Python
python更新列表的方法
Jul 28 Python
python使用pyqt写带界面工具的示例代码
Oct 23 Python
python通过getopt模块如何获取执行的命令参数详解
Dec 29 Python
基于python requests库中的代理实例讲解
May 07 Python
python 队列基本定义与使用方法【初始化、赋值、判断等】
Oct 24 Python
Matplotlib scatter绘制散点图的方法实现
Jan 02 Python
如何给Python代码进行加密
Jan 10 Python
Pandas把dataframe或series转换成list的方法
Jun 14 Python
Python同时迭代多个序列的方法
Jul 28 Python
python3爬虫中引用Queue的实例讲解
Nov 24 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也可以?成Shell Script
2006/10/09 PHP
WordPress中限制非管理员用户在文章后只能评论一次
2015/12/31 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
Javascript的比较汇总
2016/07/25 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
[41:08]2014 DOTA2国际邀请赛中国区预选赛 HGT VS NE
2014/05/22 DOTA
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
python使用PyFetion来发送短信的例子
2014/04/22 Python
9种python web 程序的部署方式小结
2014/06/30 Python
Python中字符串的格式化方法小结
2016/05/03 Python
Python内置函数OCT详解
2016/11/09 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
Django如何实现内容缓存示例详解
2017/09/24 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
python利用rsa库做公钥解密的方法教程
2017/12/10 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
python判断计算机是否有网络连接的实例
2018/12/15 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
python如何实现不用装饰器实现登陆器小程序
2019/12/14 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
HTML5新表单元素_动力节点Java学院整理
2017/07/12 HTML / CSS
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
伦敦新晋轻奢耳饰潮牌:Tada & Toy
2020/05/25 全球购物
实习生个人找工作的自我评价
2013/10/30 职场文书
七年级地理教学反思
2014/01/26 职场文书
信息与计算科学专业推荐信
2014/02/23 职场文书
食品安全责任书
2014/04/15 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
js基础语法与maven项目配置教程案例
2021/07/15 Javascript
深入理解pytorch库的dockerfile
2022/06/10 Python