(七)取词翻译实现

本周主要实现了取词翻译功能,当开启后可以使用鼠标选取要翻译的词汇,在屏幕右上角即可弹出桌面气泡显示翻译结果

大致思路是开启此功能后,会对剪切板进行监视,当剪切板内容有变化时,就会提取剪切板内容,然后由数据接口处理,返回的翻译结果以桌面气泡的

形式显示在屏幕上。

#!/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为剪切板有变化时调用的回调函数

效果为

但是目前还有一个问题就是如何在合适的时间结束这个进程,本周将对这个问题进行研究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值