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

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()
时间: 2024-10-15 01:44:07

学习笔记-实验楼项目课(Linux桌面字典)的相关文章

实验楼项目课学习笔记-jQuery翻转拼图游戏

项目效果图如下: game/index.html <!DOCTYPE html><html>     <head>         <meta charset="utf-8">         <title>             蓝色拼图        </title>         <!-- 引入Bootstrap css -->         <link rel="style

thinkphp学习笔记3—项目编译和调试模式

原文:thinkphp学习笔记3-项目编译和调试模式 1.项目编译 在章节2.4项目编译中作者讲到使用thinkphp的项目在第一次运行的时候会吧核心需要加载的文件去掉空白和注释合并到一个文件中编译并缓存,第二次运行时直接载入编译缓存,这样省去一些IO开销,加快执行速度.并且在3.0以上的版本中海做了一些优化: 1.合并和兴编译缓存和项目编译缓存,不再生成两个缓存文件 2.直接对本地环境生成设置和常量定义减少环境判断 3.编译缓存可以直接替换框架入口甚至项目入口,甚至脱离框架独立运行 4.通过参

JOAL学习笔记 第八课 OggVorbis格式流

JOAL学习笔记 如果将之前实例代码中的错误数量比作毛毛雨的话,笔者已经让本次课程的大暴雨淋成落汤鸡了-- 由于本次课程中原文作者并未给出完整的代码片,也并未给出解码器的实现,因此我在这里把我已经调通的测试代码贴出来. 先贴出一张图,这样能让大家对整个实现的体系有所了解: 可以看出,我并没有选择教程建议的j-ogg.de提供的j-oggAPI,这个德国网站上并没有实例的讲解,仅仅提供了一个API文档,我参照这个文档(英文)写了一些测试代码,发现其内部报了一个数组越界错误,估计这套API应该是有B

Linux学习笔记(一)——Linux系统概要及基本操作

一.  Linux系统概要 本章的主要内容是对Linux系统的结构和各组件的功能做一个简单的介绍,涉及到Linux系统各组件的相关概念.为了更好的了解Linux系统,首先对Linux系统的基本概念做一个简单的介绍. 1.1           Linux系统组成 Linux系统由四部分组成,各组件在Linux系统中既相对独立由相互联系,每个组件实现相对独立的功能,如果将各组件分开,就不是一个完整的Linux系统.各组件协调工作才能构成一个完整的Linux系统. Linux系统主要分为下面四部分:

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

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

Linux学习笔记 第三课

一.目录结构 二.简单命令(ls,cd,pwd,which,alias,pstree,tree) 三.环境变量PATH应用 四.快捷键 五.扩展知识   (stty  ,ping 及 /var/log) 一.目录结构 1. /bin, /sbin, /usr/bin, /usr/sbin      命令目录:  lli下目录都是可执行的文件,颜色绿色.root  ->sbin   bin->普通用户 2. /boot  内核和引导程序的目录       /etc/grub.conf->/

Linux学习笔记 第十课 rpm、yum、编译安装

一.rpm 二.yum 三.编译安装 一.rpm   1.rpm简介 2.rpm 安装命令 (rpm -ivh --nodeps --force) 3.rpm 卸载 (rpm -e) 4.rpm 查询 (rpm -q -qa -ql -qf) 1.rpm 简介: rpm:(Redhat Package Manager),可以在Redhat和Suse系统使用 [[email protected] ~] mount /dev/cdrom /mnt   // 挂载光驱 [[email protecte

Linux学习笔记 第四课

************************************************** mkdir,rmdir,rm,cp,mv,chown,chmod都有-v选项 可视化  都用了别名 提示,避免提示都用绝对路径 /bin/cp /bin/mv /bin/rm /bin/chown /bin/chmod ************************************************** 一.目录相关命令(mkdir.rmdir.rm.cp.mv) 二.文件相关命

linux学习笔记-第二十七课-tamcat与resin

一.tomcat 1. 安装JDK [[email protected] src]# tar -zxvf jdk-7u79-linux-i586.tar.gz # 编辑初始化信息脚本 [[email protected] src]# mv jdk1.7.0_79  /usr/local/jdk1.7.0_79 [[email protected] src]# vim /etc/profile.d/java.sh JAVA_HOME=/usr/local/jdk1.7.0_79 JAVA_BIN=