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 相关文章推荐
开源Web应用框架Django图文教程
Mar 09 Python
python下载图片实现方法(超简单)
Jul 21 Python
python利用MethodType绑定方法到类示例代码
Aug 27 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 Python
TensorFlow在MAC环境下的安装及环境搭建
Nov 14 Python
浅析PHP与Python进行数据交互
May 15 Python
详解Python字符串切片
May 20 Python
Python3使用xlrd、xlwt处理Excel方法数据
Feb 28 Python
pyspark 随机森林的实现
Apr 24 Python
python 中关于pycharm选择运行环境的问题
Oct 31 Python
python 利用panda 实现列联表(交叉表)
Feb 06 Python
基于Python实现射击小游戏的制作
Apr 06 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 xml-rpc远程调用
2008/12/19 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
php 图片上传类代码
2009/07/17 PHP
php用header函数实现301跳转代码实例
2013/11/25 PHP
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
php生成随机颜色方法汇总
2014/12/03 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
2015/03/18 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
php打乱数组二维数组多维数组的简单实例
2016/06/17 PHP
PHP生成图像验证码的方法小结(2种方法)
2016/07/18 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
制作特殊字的脚本
2006/06/26 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
鼠标移入移出事件改变图片的分辨率的两种方法
2013/12/17 Javascript
在Node.js中使用HTTP上传文件的方法
2015/06/23 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
jQuery操作css样式
2017/05/15 jQuery
vue二级菜单导航点击选中事件的方法
2018/09/12 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
详解vue页面首次加载缓慢原因及解决方案
2019/11/06 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
[02:46]2014DOTA2国际邀请赛 选手为你解读比赛MVP充满梦想
2014/07/09 DOTA
[07:49]2014DOTA2国际邀请赛 Newbee夺冠后采访xiao8坦言奖金会上交
2014/07/23 DOTA
Python命令行参数解析模块getopt使用实例
2015/04/13 Python
Flask框架钩子函数功能与用法分析
2019/08/02 Python
全球最大的服务市场:Fiverr
2017/01/03 全球购物
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
网络安全方面的面试题
2015/11/04 面试题
世界经理人咨询有限公司面试
2014/09/23 面试题
护理自荐信
2013/10/22 职场文书
公司面试感谢信
2014/02/01 职场文书
心理咨询专业自荐信
2014/07/07 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
2015年度女工工作总结
2015/10/22 职场文书
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
vue实现简易音乐播放器
2022/08/14 Vue.js