python实现划词翻译
作者:踢飞足球 发布时间:2023-04-28 19:36:54
最近因为编程,需要大量地看一些说明文档,无奈说明文档都是英文的,可把我这个半桶水折腾死了,太多词汇不知道,一个个复制翻译太麻烦了。于是我根据自己的需要,用python写了一个划词翻译。
一、使用逻辑
由于我是看PDF文档,用的是一款轻量级的PDF阅读器(SumatraPDF),这款阅读器只有5M,但是阅读很舒服很流畅,渲染也很到位。但是没有其他阅读器有许多强大功能,比如说划词翻译。
我的想法是一旦发现我复制就可以在当前鼠标位置显示一个翻译结果框。基于这个想法,我一开始准备使用MFC编写,因为MFC能够轻易获得系统消息,钩子调用十分简单。可是我把检测复制,显示文本框都做好的时候,发现一个悲伤的事实,c++的http库实在是不怎么样,竟然无法访问http://地址,经过一晚的尝试——失败,这才打算使用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)
猜你喜欢
- 本文实例讲述了wxPython主框架的简单用法,分享给大家供大家参考。具体如下:程序代码如下:import wx class MyApp(w
- 【名称】Abs【类别】数学函数【原形】Abs(number)【参数】必选的。Number参数是一个任何有效的数值型表达式【返回值】同numb
- session_unset() 释放当前在内存中已经创建的所有$_SESSION变量,但不删除session文件以及不释放对应的sessio
- 安装pyserialpip install pyserial查看可用的端口# coding:utf-8import serial.tools
- 以下是引用片段:Function c2u(myText) Dim i c2u = "" For i = 1 to Len
- 没注意到MooTools的Cookie类在写的时候自己做了一次encode,在读的时候做了一次decode,在一般的情况下,这个不会有什么问
- 本周暂时比较清闲,可以保持每日一更的速度。国外身份证项目新增需求,检测出身份证正面的人脸。最开始考虑mobilenet-ssd,经同事提醒,
- 而随着设备硬件配置的不断提升,对中小型应用程序来说,对算法的空间复杂度的要求也宽松了不少。不过,在当今 Web2.0 时代,对应用程序的时间
- 数据共享是数据库最基本的特征之一。但是数据共享虽然为员工带来了便利,但也产生了一些负面作用。例如因用户并发存取而导致的对数据一致性的破坏、由
- yaml简介1.yaml [ˈjæməl]: Yet Another Markup Language :另一种标记语言。
- 在我之前解释了flask如何支持多线程主要通过两个类来实现,LocalStack和Local,在Local中有两个属性,__storage_
- AddHeaderAddHeader 方法用指定的值添加 HTML 标题。该方法常常向响应添加新的 HTTP 标题。它并不替代现有的同名标题
- 我们可以利用Session对象来进行注册验证。Session对象会帮我们把某一用户的信息保留下来,让后续的网页读取。我们就可以在用户注册成功
- 1069错误(由于登录失败而无法启动服务)解决方法在本版面出现这个问题的频率也算是很高的了,新手通常会比较多遇到这个问题原因很简单,安装SQ
- 昨天面试上来就是一个算法,平时基本的算法还行,结果变个法就不会了。。。感觉应该刷一波Leecode冷静下。。。今天抽空看下。题目就是要求O(
- readlines的帮助信息>>> fr=open('readme.txt')>>> h
- 前言你有没有经常好奇一些音乐软件的频谱特效是怎么做的,为什么做的这么好看?有没有想试试自己提取音乐频谱并可视化展现出来?今天,咱就结合上次的
- 具体用法:1、<%= Counters.Get(CounterName) %>显示计数器的值。2、<% counterva
- 前言Logistic回归涉及到高等数学,线性代数,概率论,优化问题。本文尽量以最简单易懂的叙述方式,以少讲公式原理,多讲形象化案例为原则,给
- 学习目的: 掌握文本框的用法 初次接触try…catch…语法 今天内容很轻松,用一个例子,输入年月日,判断输入是否正确 图片如下: 用个