您的位置:首页 > 移动开发 > Unity3D

(七)取词翻译实现

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

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

形式显示在屏幕上。

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

效果为



但是目前还有一个问题就是如何在合适的时间结束这个进程,本周将对这个问题进行研究
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dash python scope ubuntu unity