(七)取词翻译实现
2014-08-31 21:55
387 查看
本周主要实现了取词翻译功能,当开启后可以使用鼠标选取要翻译的词汇,在屏幕右上角即可弹出桌面气泡显示翻译结果
大致思路是开启此功能后,会对剪切板进行监视,当剪切板内容有变化时,就会提取剪切板内容,然后由数据接口处理,返回的翻译结果以桌面气泡的
形式显示在屏幕上。
其中xclip借用x系统的剪切板,并利用X,X.display将结果显示出来,viewTranslate函数用于处理数据,record_callback为剪切板有变化时调用的回调函数
效果为
但是目前还有一个问题就是如何在合适的时间结束这个进程,本周将对这个问题进行研究
大致思路是开启此功能后,会对剪切板进行监视,当剪切板内容有变化时,就会提取剪切板内容,然后由数据接口处理,返回的翻译结果以桌面气泡的
形式显示在屏幕上。
#!/usr/bin/env python #-*- coding: utf-8 -*- import os import sys from Xlib import X,XK,display from Xlib.ext import record from Xlib.protocol import rq import urllib2 import json import pynotify record_dpy=display.Display() # Create a recording context; we only want key and mouse events ctx = record_dpy.record_create_context( 0, [record.AllClients], [{ 'core_requests': (0, 0), 'core_replies': (0, 0), 'ext_requests': (0, 0, 0, 0), 'ext_replies': (0, 0, 0, 0), 'delivered_events': (0, 0), 'device_events': (X.KeyPress, X.MotionNotify), 'errors': (0, 0), 'client_started': False, 'client_died': False, }]) pre_word="" #上次翻译的词语 #appkey="Your AppKey" #百度翻译申请的appKey def viewTranslate(): global pre_word global appkey url="http://fanyi.youdao.com/openapi.do?keyfrom=UbuntuDictionry&key=123081966&type=data&doctype=json&version=1.1&q=%s" % (pre_word) result=urllib2.urlopen(url).read() myresults=json.loads(result) pynotify.init("AutoTranslate") try: error_msg=myresults["error_msg"] query=myresults["query"] bubble=pynotify.Notification('"'+query+'"的翻译出错',error_msg) bubble.show() except: web_explains = '' basic_explains = '' if myresults['web'] != {}: items_web = myresults['web'][0] for i in items_web['value']: web_explains += ' ' web_explains += i items_basic = myresults['basic'] query = myresults['query'] basic_explains = '' for k in items_basic ['explains']: basic_explains += ' ' basic_explains += k explains = web_explains+'\n'+basic_explains bubble=pynotify.Notification('"'+query+'"的翻译结果',explains) bubble.show() def record_callback(reply): global pre_word if reply.category != record.FromServer: return if reply.client_swapped: #print "* received swapped protocol data, cowardly ignored" return if not len(reply.data) or ord(reply.data[0]) < 2:# not an event return data = reply.data while len(data): event, data = rq.EventField(None).parse_binary_value(data, record_dpy.display, None, None) if event.type == X.ButtonRelease: pipe = os.popen("xclip -o") text = pipe.readline() pipe.readlines() #清空管道剩余部分 pipe.close() text=text.strip('\r\n\x00').lower().strip() if pre_word != text and text!="": pre_word=text viewTranslate() def gettext(): os.system("xclip -f /dev/null") #清空剪切板 record_dpy.record_enable_context(ctx,record_callback) record_dpy.record_free_context(ctx) def main(): gettext() if __name__=='__main__': main()
其中xclip借用x系统的剪切板,并利用X,X.display将结果显示出来,viewTranslate函数用于处理数据,record_callback为剪切板有变化时调用的回调函数
效果为
但是目前还有一个问题就是如何在合适的时间结束这个进程,本周将对这个问题进行研究
相关文章推荐
- 搞了一天终于实现了 DataGrid 中的多国语言的问题,采用了中文向其他语言自动翻译的方法,其实不难,主要是想法(本文不涉及这个计算机技术问题,仅以此作为标题)
- 鼠标屏幕取词技术的原理和实现
- 内存管理:算法及其c/c++实现 翻译二
- [翻译]脚本引擎实现 - 第一部分 总揽
- [翻译]脚本引擎实现 - 第三部分 解析器
- [翻译]脚本引擎实现 - 第一部分 总揽
- 内存管理:算法及其c/c++实现 翻译三
- 内存管理:算法及其c/c++实现 翻译七
- [翻译计划]脚本引擎实现
- 设计并实现用于ASP.NET一个通用的数据存取层应用程序 原作者 Paul Abarham 翻译 cwxiao888@163.com
- 使用Command模式实现撤销机制 (Code Project 精选翻译)
- 在C#程序中实现插件架构 - Sunmast翻译(转载)
- 内存管理:算法及其c/c++实现 翻译一
- 用DX8实现Skin Meshes(翻译版)
- [转载][由Sunmast翻译]在C#程序中实现插件架构
- 使用Command模式实现撤销机制 (Code Project 精选翻译)
- 【翻译】数据表单向导的快速实现
- 内存管理:算法及其c/c++实现 翻译四
- 鼠标屏幕取词技术的原理和实现
- [翻译]脚本引擎实现 - 第三部分 解析器