学习笔记-实验楼项目课(Linux桌面字典)

importos

importre

importtime

importfcntl

importlogging

importpygtk

pygtk.require('2.0')

importgtk

importgobject

importwebkit

importrequests

importjson

 

 

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)

 

classDict:

    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", lambdaw: 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_changedto %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 notself.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 bigenough, hide window')

                self.window.hide();

            if(time.time() -self.popuptime >3):

                logging.debug('time longenough, 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("Querynothing")

                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 injs:

            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( ['<ahref="javascript:void(0);">%s</a>: %s'%(i['key'], ' '.join(i['value'])) for iin 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>

        <ahref="javascript:void(0);" id="wordbook"class="add_to_wordbook" title="点击在浏览器中打开"οnclick="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):

        iflen(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()

 

defmain():

    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 isalready running!!!'

        exit(0)

 

    main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值