实验楼项目课学习笔记-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" class="add_to_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-24 07:42:02

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

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

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

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程(高俊峰)

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程 第一课 Linux运维经验分享与思路 1.一般把主机名,写到hosts下    127.0.0.1    hostname,因为很多应用要解析到本地.oracle没有这个解析可能启动不了. 2.注释掉UUID以及MAC地址,需要绑定网卡的时候,这个可能会有影响. 3.磁盘满了无法启动,  var下木有空间,无法创创建PID等文件,导致文件无法启动,按e   进入single  然后b  重启进入单用户模式. 4.ssh登陆系

Linux 程序设计学习笔记----Linux下文件类型和属性管理

转载请注明出处:http://blog.csdn.net/suool/article/details/38318225 部分内容整理自网络,在此感谢各位大神. Linux文件类型和权限 数据表示 文件属性存储结构体Inode的成员变量i_mode存储着该文件的文件类型和权限信息.该变量为short int类型. 这个16位变量的各个位功能划分为: 第0-8位为权限位,为别对应拥有者(user),同组其他用户(group)和其他用户(other)的读R写W和执行X权限. 第9-11位是权限修饰位,

python学习笔记4:字典

python学习笔记4:字典 总结:字典是可变变量: 字典是不排序的,所以不能像列表,元组,字符串一样,切片 1.定义字典dict  --花括号{},字典的只是key-value形式 比如:stu={'name':'zhangying','age':18,'score'=99} 2.key取值,get()方法取值 1)dictname[key] , 取key对应的value值,如果不存在,报错 2)dictname.get(key) , 取key对应的value值,如果不存在,返回none:还可

SHELL第二课学习笔记

SHELL第二课学习笔记 A.脚本规范申明信息: #!bin/bash #Date 14:00 2014-1-30 #Author xiaoping #Mail [email protected] #Function: Thsi scrits funcion is .... #version 1.1 ~ B.注意点: a.成对内容一次写出来 {}.[].''.``.""# b.[]中括号两端需要空格 c.流程控制语句一次性写完格式 d.vi多行缩进 按v进入visual状态,选择多行,

python基础教程_学习笔记6:字典

字典 映射(mapping),一种可通过名字引用值得数据结构. 字典是python中唯一内建的映射类型. 字典中的值没有特殊的顺序,但都存储在一个特定的键(key)里.键可以是数字.字符串甚至是元组. 字典的使用 某些情况下,字典比列表更加适用,比如: 表征游戏棋盘的状态,每个键都是由坐标值组成的元组: 存储文件修改数,用文件名作为键: 数字电话/地址簿: 假如有一个人名列表如下: >>>names=['Alice','Beth','Cecil','Dee-Dee','Earl'] 如果

SHELL第一课学习笔记

SHELL第一课学习笔记 什么叫Shell shell是一个命令解释器,它在操作系统最外层,负责直接与用户对话,把用户输入的命令解释给 操作系统并处理各种各样的操作的输出结果,输出到屏幕返回用户(交互式或者非交互式). 案例1.简单清除/var/log下的messages日志脚本: #!bin/bash cd /var/log cat /dev/null > messages echo "Logs cleaned up" 案例2.包含变量.命令.流程控制语句清除/var/log下

学习笔记: Linux目录,inode

目录,inode学习笔记 1. 关于目录,文件,数据块 对于使用计算机的人而言,经常有一种 错误的认知:目录(或者说,文件夹)里面存放着文件.实际上,目录里面并不存放文件,以及文件数据. 实际上,目录是一个特殊的文件,针对这个特殊的文件也存在一些特殊的规则,比如利用命令cp /dev/null <your directory>并不能够销毁这个特殊的文件,因为目录的一些特殊的比特位保证了这一安全性,降低了人工操作带来的风险.在一些老版本的Unix系统里面,用户可以利用cat命令打开目录,查看里面

学习笔记-实验楼项目课(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 =