博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习笔记-实验楼项目课(Linux桌面字典)
阅读量:7013 次
发布时间:2019-06-28

本文共 5212 字,大约阅读时间需要 17 分钟。

hot3.png

import osimport reimport timeimport fcntlimport loggingimport pygtkpygtk.require('2.0')import gtkimport gobjectimport webkitimport requestsimport 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 = '
'.join(js['translation'])        if 'phonetic' in js['basic']:            phonetic = js['basic']['phonetic']        else:            phonetic = ''        explains = '
'.join(js['basic']['explains'])        web = '
'.join( ['
%s: %s'%(i['key'], ' '.join(i['value'])) for i in js['web'][:3] ] )        html = '''
         

        %(translation)s        
< %(phonetic)s >         
 
        

         
[ %(word)s ]         
基本翻译:        

 %(explains)s 

         
[ %(word)s ]         
网络释意:        

 %(web)s 

         ''' % 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()

转载于:https://my.oschina.net/u/2256500/blog/340729

你可能感兴趣的文章
数据库缓存
查看>>
mvc 数据验证金钱格式decimal格式验证
查看>>
常用的Web服务器
查看>>
UPW学习资料整理 .NET C# 转
查看>>
Oracle12c中新建用户
查看>>
分布式编译工具
查看>>
对我而言晦涩的递归
查看>>
React Native 从入门到原理
查看>>
iOS如何随意的穿插跳跃,push来pop去
查看>>
使用maven编译Java项目 http://www.tuicool.com/articles/YfIfIrq
查看>>
Strut2中的session和servlet中的session的区别
查看>>
自定义adapter实现listview双列显示
查看>>
MyBatis——实现关联表查询
查看>>
struts2的MVC模式
查看>>
cocos2d-x JS 复选按钮checkBox的单选与多选
查看>>
表格花式效果
查看>>
Thrift 基于zookeeper改造模式
查看>>
rsync与cwRsync
查看>>
图像的形态学处理
查看>>
Elasticsearch5.5 部署Head插件
查看>>