PyGTK的自定义组合框行为

问题描述:

我试图创建一个行为像一个在这里自定义组合框:http://chir.ag/projects/name-that-color/PyGTK的自定义组合框行为

我有两个问题,现在我似乎没有

  1. 可以找到一种方法在侧面有一个滚动条; gtk.rc_parse_string函数应该这样做,因为ComboBox小部件具有“显示为列表”样式属性,但由于某种原因,我的自定义小部件似乎不受影响。

  2. 当您从我的小部件中选择一种颜色时,再次单击组合框,而不是显示所选项目及其邻居,滚动窗口从顶部开始,没有明显的原因。

这是代码,你几乎可以忽略__load_name_palette方法。您需要/usr/share/X11/rgb.txt文件来运行这段代码,它看起来像这样:http://pastebin.com/raw.php?i=dkemmEdr

import gtk 
import gobject 
from os.path import exists 

def window_delete_event(*args): 
    return False 

def window_destroy(*args): 
    gtk.main_quit() 

class ColorName(gtk.ComboBox): 
    colors = [] 
    def __init__(self, name_palette_path, wrap_width=1): 
     gtk.ComboBox.__init__(self) 
     liststore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, 
           gobject.TYPE_STRING) 
     name_palette = self.__load_name_palette(name_palette_path) 
     for c in name_palette: 
      r, g, b, name = c 
      if ((r + g + b)/3.) < 128.: 
       fg = '#DDDDDD' 
      else: 
       fg = '#222222' 
      bg = "#%02X%02X%02X" % (r, g, b) 
      liststore.append((name, bg, fg)) 

     self.set_model(liststore) 
     label = gtk.CellRendererText() 
     self.pack_start(label, True) 
     self.set_attributes(label, background=1, foreground=2, text=0) 
     self.set_wrap_width(wrap_width) 

     if len(name_palette) > 0: 
      self.set_active(0) 
     self.show_all() 

    def __load_name_palette(self, name_palette_path): 
     if exists(name_palette_path): 
      try: 
       f = open(name_palette_path,'r') 
       self.colors = [] 
       palette = set() 
       for l in f: 
        foo = l.rstrip().split(None,3) 
        try: 
         rgb = [int(x) for x in foo[:3]] 
         name, = foo[3:] 
        except: 
         continue 
        k = ':'.join(foo[:3]) 
        if k not in palette: 
         palette.add(k) 
         self.colors.append(rgb + [name]) 
       f.close() 
       return self.colors 
      except IOError as (errno, strerror): 
       print "error: failed to open {0}: {1}".format(name_palette_path, strerror) 
       return [] 
      else: 
       return [] 

if __name__ == '__main__': 
    win = gtk.Window() 
    #colname = ColorName('./ntc.txt') 
    colname = ColorName('/usr/share/X11/rgb.txt') 
    gtk.rc_parse_string("""style "mystyle" { GtkComboBox::appears-as-list = 1 } 
    class "GtkComboBox" style "mystyle" """) 
    print 'appears-as-list:', colname.style_get_property('appears-as-list') 
    model = gtk.ListStore(gobject.TYPE_STRING) 
    hbox = gtk.HBox() 
    win.add(hbox) 
    hbox.pack_start(colname) 
    win.connect('delete-event', window_delete_event) 
    win.connect('destroy', window_destroy) 
    win.show_all() 
    gtk.main() 

问题是self.show_all()线。此外,你不能有一个清单和一个wrap_width!= 1