python实现划词翻译

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

一:使用逻辑

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

二:需要引用的库

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

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

三:代码实现

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #PyMouse得到的是2维字符串,但是tkinter生成窗体时需要的是类似(100*100+x+y)的字符串,100*100是窗口大小,xy是坐标点。我在这里调整了窗体出现的位置,方便查看翻译后关闭窗口,
    def transMousePosition():
    m = PyMouse()
    return "300x50+"+str(m.position()[0]-300)+"+"+str(m.position()[1]-15)

    #获得剪切板数据,同时清洗数据将换行符等去掉
    def getCopyText():
    wc.OpenClipboard()
    copy_text = wc.GetClipboardData(win32con.CF_TEXT)
    copy_text=copy_text.strip().replace("\r\n"," ").replace("\n"," ").replace("\r"," ")
    wc.CloseClipboard()
    return copy_text

    #返会是否有新的复制数据,cmp函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。
    def newCopyData():
    if cmp(currentData,str(getCopyText()))!=0:
    return 1
    else:
    return 0


    #得到所有翻译文本,因为json数据是按照每一句每一句接收的,所以当我们要获得一大段文本翻译时,必须要遍历数据
    def getTransText(jsonText):
    text=''
    for listValue in jsonText['translateResult'][0]:
    text+= listValue['tgt']
    return text
  2. 主程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    if __name__ == '__main__':
    req_url = 'http://fanyi.youdao.com/translate' # 创建连接接口,这里是有道词典的借口
    # 创建要提交的数据
    currentData=str(getCopyText())
    Form_Date = {}
    Form_Date['doctype'] = 'json'
    while True:
    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 = getTransText(json.loads(html)) #以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@outlook.com

总结

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# -*- 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 #定时器,减少占用
import win32con
currentData=''

#PyMouse得到的是2维字符串,但是tkinter生成窗体时需要的是类似(100*100+x+y)的字符串,100*100是窗口大小,xy是坐标点。
def transMousePosition():
m = PyMouse()
return "300x50+"+str(m.position()[0]-300)+"+"+str(m.position()[1]-15)
#获得剪切板数据
def getCopyText():
wc.OpenClipboard()
copy_text = wc.GetClipboardData(win32con.CF_TEXT)
copy_text=copy_text.strip().replace("\r\n"," ").replace("\n"," ").replace("\r"," ")
wc.CloseClipboard()
return copy_text
#返会是否有新的复制数据
def newCopyData():
if cmp(currentData,str(getCopyText()))!=0:
return 1
else:
return 0
#得到所有翻译文本
def getTransText(jsonText):
text=''
for listValue in jsonText['translateResult'][0]:
text+= listValue['tgt']
return text

if __name__ == '__main__':
req_url = 'http://fanyi.youdao.com/translate' # 创建连接接口,这里是有道词典的借口
# 创建要提交的数据
currentData=str(getCopyText())
Form_Date = {}
Form_Date['doctype'] = 'json'
while True:
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 = getTransText(json.loads(html)) #以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)

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 一:使用逻辑
  2. 2. 二:需要引用的库
  3. 3. 三:代码实现
  4. 4. 总结
,