请前往此处

http://imdiot.wordpress.com/

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

首先是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()