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)


猜你喜欢
- 一、包的导入Golang 当导入多个包时,一般按照字母顺序排列包名称,像Goland 等IDE 会在保存文件时自动完成这个动作。Golang
- 一.脚本基础1.USE语句设置当前数据库。2.声明变量语法:DECLARE @变量名 变量类型在声明变量后,给变量赋值之前,变量的值为NUL
- MYSQL在一个字段值前面加字符窜,如下:member 表名card 字段名update member SET card = '00
- $emit传入的事件名称只能使用小写,不能使用大写的驼峰规则命名如果修改后还是不行的话,就改用:this.$parent.Event (Ev
- 用asp程序进行网页设计,大多因为需要访问数据库,然后再将数据显示到页面,如果数据很多的话,页面的访问速度也就变慢了,为了解决这个问题,可以
- 安装SDK:pip install baidu-aip如果在pycharm里也可以在setting----Project Interpret
- 一.脚本基础 1.USE语句 &n
- Oracle过程和函数相信大家都比较了解,下面就为您详细介绍Oracle过程和函数二者之间的区别,希望可以让您对Oracle过程和函数有更深
- 这次,我们用Turtle模块结合三角函数,绘制出这样的勾股树:首先,导入模块from turtle import *from math im
- Python 3.8是Python语言的最新版本,它适合用于编写脚本、自动化以及机器学习和Web开发等各种任务。现在Python 3.8已经
- 本文实例为大家分享了Python查询IP地址归属的具体代码,供大家参考,具体内容如下#!/usr/bin/env python# -*- c
- ---- ORACLE数据库由数据文件,控制文件和联机日志文件三种文件组成。由于磁盘空间的变化,或者基于数据库磁盘I/O性能的调
- hp中怎么让json_encode不自动转义斜杠“/”?下面本篇文章给大家介绍一下PHP中让json_encode不自动转义斜杠“/”的方法
- 复制是将主数据库的DDL和DML操作通过二进制日志传到从库上,然后再从库重做,从而使得从库和主库保持数据的同步。MySQL可以从一台主库同时
- 挑钻石第二弹seaborn是matplotlib的补充包,提供了一系列高颜值的figure,并且集成了多种在线数据集,通过sns.load_
- 导入模块from bs4 import BeautifulSoupsoup = BeautifulSoup(html_doc,"h
- 1. 前言文章主要围绕着以下三个问题:group by的作用where与having的区别表的连接分为哪些,分别是什么作用2. 表的设计在创
- 前言提到数据库,大家第一时间想到的可能是 sql 数据库,这种数据库非常好用,但是对于新手就不是很容易上手,需要熟悉一段时间才可以大概掌握。
- 本文实例讲述了Python使用pickle模块储存对象操作。分享给大家供大家参考,具体如下:众所周知,当我们需要储存数据的时候,就需要用到重
- 前言猪年除夕之夜在亲人群抢红包心血来潮,想用python做比较好玩的新年祝福给亲人们乐呵乐呵。奈何初学Python,底子比较薄,通过查阅相关