PySVN checkout时中文路径的解决
在玩PySVN时发现如果文件路径出现中文的话会出现"Can't convert string from 'UTF-8' to native encoding:"错误
祭出谷歌娘,发现早在05年就已经有了解决方法了
import locale
language_code, encoding = locale.getdefaultlocale()
if language_code is None:
language_code = 'en_GB'
if encoding is None:
encoding = 'UTF-8'
if encoding.lower() == 'utf':
encoding = 'UTF-8'
locale.setlocale( locale.LC_ALL, '%s.%s' % (language_code, encoding))
Rhythmbox文件夹视图浏览的插件
介绍
Rhythmbox浏览音乐时只能按照音乐文件的信息来分类
但有时有许多音乐文件的信息并不完整且音乐文件又很多的时候 按照音乐信息分类就不如直接按照目录分类清晰了
所以就写了一个文件夹视图的插件
文件夹视图的根目录是读取自rhythmbox首选项中的音乐文件存放位置的
项目地址
http://code.google.com/p/folderview/
截图

安装
svn checkout http://folderview.googlecode.com/svn/trunk/ folderview
cp -R folderview/FolderView ~/.gnome2/rhythmbox/plugins/ 或 cp -R folderview/FolderView /usr/lib/rhythmbox/plugins/
使用
启动Rhythmbox
菜单栏 编辑->插件
勾选“文件夹视图”
修改ibus的颜色
看久了千篇一律的ibus输入法的输入框总会有点腻了的感觉
so 稍微hack了一下代码改了一下颜色~
原版ibus-pinyin
改版ibus-pinyin
改版ibus-sunpinyin
改版ibus-cloud-pinyin
这下有了点fcitx的感觉了吧~~~
只是自己修改玩玩 所以没有深入研究代码
*** candidatepanel.py 2010-09-13 14:08:16.000000000 +0800
--- /home/yangguang/Desktop/candidatepanel.py 2010-09-13 12:26:28.000000000 +0800
***************
*** 87,98 ****
for i in range(0, 16):
label1 = Label("%c." % ("1234567890abcdef"[i]))
label1.set_alignment(0.0, 0.5)
- label1.modify_fg(gtk.STATE_NORMAL, gtk.gdk.Color("#013BC5"))
label1.show()
label2 = Label()
label2.set_alignment(0.0, 0.5)
- label2.modify_fg(gtk.STATE_NORMAL, gtk.gdk.Color("#69A0EC"))
label1.show()
if self.__orientation == ibus.ORIENTATION_VERTICAL:
--- 87,96 ----
***************
*** 100,110 ****
label2.set_property("xpad", 8)
ebox1 = EventBox()
ebox1.set_no_show_all(True)
- ebox1.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color("#FFFFFF"))
ebox1.add(label1)
ebox2 = EventBox()
ebox2.set_no_show_all(True)
- ebox2.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color("#FFFFFF"))
ebox2.add(label2)
self.__vbox1.pack_start(ebox1, False, False, 2)
self.__vbox2.pack_start(ebox2, False, False, 2)
--- 98,106 ----
***************
*** 116,122 ****
hbox.pack_start(label2, False, False, 1)
ebox = EventBox()
ebox.set_no_show_all(True)
- ebox.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color("#FFFFFF"))
ebox.add(hbox)
self.pack_start(ebox, False, False, 4)
self.__candidates.append((ebox,))
--- 112,117 ----
***************
*** 148,159 ****
if i == focus_candidate and show_cursor:
if attrs == None:
attrs = pango.AttrList()
! #color = self.__labels[i][1].style.base[gtk.STATE_SELECTED]
! #print color
end_index = len(text.encode("utf8"))
! #attr = pango.AttrBackground(color.red, color.green, color.blue, 0, end_index)
! #attrs.change(attr)
! color = gtk.gdk.Color("#FF55FF")
attr = pango.AttrForeground(color.red, color.green, color.blue, 0, end_index)
attrs.insert(attr)
--- 143,153 ----
if i == focus_candidate and show_cursor:
if attrs == None:
attrs = pango.AttrList()
! color = self.__labels[i][1].style.base[gtk.STATE_SELECTED]
end_index = len(text.encode("utf8"))
! attr = pango.AttrBackground(color.red, color.green, color.blue, 0, end_index)
! attrs.change(attr)
! color = self.__labels[i][1].style.text[gtk.STATE_SELECTED]
attr = pango.AttrForeground(color.red, color.green, color.blue, 0, end_index)
attrs.insert(attr)
***************
*** 229,236 ****
self.__moved_cursor_location = None
self.__recreate_ui()
-
- self.__viewport.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color("#FFFFFF"))
def __handle_move_end_cb(self, handle):
# store moved location
--- 223,228 ----
***************
*** 251,257 ****
# create aux label
self.__aux_label = Label(self.__aux_string)
- self.__aux_label.modify_fg(gtk.STATE_NORMAL, gtk.gdk.Color("#EB50A0"))
self.__aux_label.set_attributes(self.__aux_attrs)
self.__aux_label.set_alignment(0.0, 0.5)
self.__aux_label.set_padding(8, 0)
--- 243,248 ----
***************
*** 526,532 ****
table = ibus.LookupTable()
table.append_candidate(ibus.Text("AAA"))
table.append_candidate(ibus.Text("BBB"))
- table.append_label(ibus.Text("CCC"))
cp = CandidatePanel()
cp.show_all()
cp.update_lookup_table(table, True)
--- 517,522 ----
关于PyGTK+pyinotify
import pyinotify
wm = pyinotify.WatchManager() # Watch Manager
mask = pyinotify.IN_DELETE | pyinotify.IN_CREATE # watched events
class EventHandler(pyinotify.ProcessEvent):
def process_IN_CREATE(self, event):
print "Creating:", event.pathname
def process_IN_DELETE(self, event):
print "Removing:", event.pathname
handler = EventHandler()
notifier = pyinotify.Notifier(wm, handler)
wdd = wm.add_watch('/tmp', mask, rec=True)
notifier.loop()
在这个例子中最后一行的notifier.loop()是inotify自己的loop实现
但如果想要PyGTK中使用inotify的话notifify的loop会和GTK的loop发生冲突
所以要做下小的修改
import pyinotify
import gobject
import gtk
gobject.threads_init()
wm = pyinotify.WatchManager() # Watch Manager
mask = pyinotify.IN_DELETE | pyinotify.IN_CREATE # watched events
class EventHandler(pyinotify.ProcessEvent):
def process_IN_CREATE(self, event):
print "Creating:", event.pathname
def process_IN_DELETE(self, event):
print "Removing:", event.pathname
def _quit(widget):
notifier.stop()
gtk.main_quit()
handler = EventHandler()
notifier = pyinotify.ThreadedNotifier(wm, handler)
wdd = wm.add_watch('/tmp', mask, rec=True)
notifier.start()
win=gtk.Window()
win.connect("destroy",_quit)
win.show()
gtk.main()