标签:des style http io color ar os 使用 java
import os
import re
import time
import fcntl
import logging
import pygtk
pygtk.require(‘2.0‘)
import gtk
import gobject
import webkit
import requests
import json
 
 
HOME = os.getenv("HOME") + ‘/.youdao-dict/‘
LOG = HOME + ‘/pyoudao.log‘
LOCK = HOME +  ‘/pyoudao.lock‘
QUERY_URL = ‘http://fanyi.youdao.com/openapi.do?keyfrom=tinxing&key=1312427901&type=data&doctype=json&version=1.1&q=‘
 
if not os.path.exists(HOME):
    os.mkdir(HOME)
 
logging.basicConfig(filename=LOG, level=logging.DEBUG)
 
class Dict:
    def __init__(self):
        self.mouse_in = False
        self.popuptime = 0
        self.last_selection = ‘‘
 
        # 初始化窗口
        self.window = gtk.Window(gtk.WINDOW_POPUP)
        self.window.set_title("pyoudao")
        self.window.set_border_width(3)
        self.window.connect("destroy", lambda w: gtk.main_quit())
        self.window.resize(360, 200)
 
        # 初始化垂直容器
        vbox = gtk.VBox(False, 0)
        vbox.show()
 
        # 创建一个事件容器, 并注册selection_recevied事件函数
        eventbox = gtk.EventBox()
        eventbox.connect("selection_received", self._on_selection_received)
        eventbox.connect(‘enter-notify-event‘, self._on_mouse_enter)
        eventbox.connect(‘leave-notify-event‘, self._on_mouse_leave)
 
        # 注册周期函数_on_timer,每隔500毫秒执行一次
        gobject.timeout_add(500, self._on_timer, eventbox)
        eventbox.show()
 
        # 创建一个webview
        self.view = webkit.WebView()
        def title_changed(widget, frame, title):
            logging.debug(‘title_changed to %s, will open webbrowser ‘ % title)
            import webbrowser
            webbrowser.open(‘http://dict.youdao.com/search?le=eng&q=‘ + title )
        self.view.connect(‘title-changed‘, title_changed)
        self.view.show()
 
        # 打包各种控件
        self.window.add(vbox)
        vbox.pack_start(eventbox)
        eventbox.add(self.view)
 
    def _on_timer(self, widget):
 
        # 开始检查选择事件
        widget.selection_convert("PRIMARY", "STRING")
 
        if self.window.get_property(‘visible‘) and not self.mouse_in:
            x, y = self.window.get_position()
            px, py, mods = self.window.get_screen().get_root_window().get_pointer()
            if (px-x)*(px-x) + (py-y)*(py-y) > 400:
                logging.debug(‘distance big enough, hide window‘)
                self.window.hide();
            if(time.time() - self.popuptime > 3):
                logging.debug(‘time long enough, hide window‘)
                self.window.hide();
 
        return True
 
    # 如果有字符串被选择,则执行该函数
    def _on_selection_received(self, widget, selection_data, data):
        if str(selection_data.type) == "STRING":
            text = selection_data.get_text()
            if not text:
                return False
            text = text.decode(‘raw-unicode-escape‘)
            if(len(text) > 20):
                return False
 
            if (not text) or (text == self.last_selection):
                return False
 
            logging.info("======== Selected String : %s" % text)
            self.last_selection = text
 
            m = re.search(r‘[a-zA-Z-]+‘, text.encode(‘utf8‘))
            if not m:
                logging.info("Query nothing")
                return False
 
            word = m.group(0).lower()
            if self.ignore(word):
                logging.info(‘Ignore Word: ‘ + word)
                return False
 
            logging.info(‘QueryWord: ‘ + word)
            self.query_word(word)
 
        return False
 
    # 查询单词
    def query_word(self, word):
        query_url = QUERY_URL + word
        # 使用requests模块获取json字符串
        js= json.loads(requests.get(query_url).text)
        if ‘basic‘ not in js:
            logging.info(‘IgnoreWord: ‘ + word)
            return
 
        x, y, mods = self.window.get_screen().get_root_window().get_pointer()
        self.window.move(x+15, y+10)
 
        self.window.present()
 
        translation = ‘<br/>‘.join(js[‘translation‘])
        if ‘phonetic‘ in js[‘basic‘]:
            phonetic = js[‘basic‘][‘phonetic‘]
        else:
            phonetic = ‘‘
        explains = ‘<br/>‘.join(js[‘basic‘][‘explains‘])
        web = ‘<br/>‘.join( [‘<a href="javascript:void(0);">%s</a>: %s‘%(i[‘key‘], ‘ ‘.join(i[‘value‘])) for i in js[‘web‘][:3] ] )
        html = ‘‘‘
<style>
.add_to_wordbook {
    background: url(http://bs.baidu.com/yanglin/add.png) no-repeat;
    vertical-align: middle;
    overflow: hidden;
    display: inline-block;
    vertical-align: top;
    width: 24px;
    padding-top: 26px;
    height: 0;
    margin-left: .5em;
}
</style>
 
        <h2>
        %(translation)s
        <span style="color: #0B6121; font-size: 12px">< %(phonetic)s > </span>
        <a href="javascript:void(0);" id="wordbook" title="点击在浏览器中打开" onclick="document.title=‘%(word)s‘"></a> <br/>
        </h2>
 
        <span style="color: #A0A0A0; font-size: 15px">[ %(word)s ] </span>
        <b>基本翻译:</b>
        <p> %(explains)s </p>
 
        <span style="color: #A0A0A0; font-size: 15px">[ %(word)s ] </span>
        <b>网络释意:</b>
        <p> %(web)s </p>
 
        ‘‘‘ % locals()
 
        # 通过webview显示html字符串
        self.view.load_html_string(html, ‘‘)
        self.view.reload()
        self.popuptime = time.time()
 
    def ignore(self, word):
        if len(word)<=3:
            return True
        return False
 
    def _on_mouse_enter(self, wid, event):
        logging.debug(‘_on_mouse_enter‘)
        self.mouse_in = True
 
    def _on_mouse_leave(self, *args):
        logging.debug(‘_on_mouse_leave‘)
        self.mouse_in = False
        self.window.hide()
 
def main():
    Dict()
    gtk.main()
 
if __name__ == "__main__":
    f=open(LOCK, ‘w‘)
    try:
        fcntl.flock(f.fileno(), fcntl.LOCK_EX|fcntl.LOCK_NB)
    except:
        print ‘a process is already running!!!‘
        exit(0)
 
    main() 
标签:des style http io color ar os 使用 java
原文地址:http://my.oschina.net/u/2256500/blog/340729