Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyGTK自定义组合框行为_Python_List_Combobox_Coding Style_Gtk - Fatal编程技术网

Python PyGTK自定义组合框行为

Python PyGTK自定义组合框行为,python,list,combobox,coding-style,gtk,Python,List,Combobox,Coding Style,Gtk,我正在尝试创建一个自定义组合框,其行为类似于此处的组合框: 我现在有两个问题: 我似乎找不到一个办法在旁边有一个滚动条;gtk.rc_parse_string函数应该做到这一点,因为ComboBox小部件有一个“显示为列表”样式的属性,但是我的自定义小部件由于某种原因似乎不受影响 当您从my widget中选择一种颜色,然后再次单击组合框,而不是显示所选项目及其相邻项目时,滚动窗口从顶部开始,没有明显的原因 这是代码,您几乎可以忽略uu加载u名称u调色板方法。您需要/usr/share/X11/

我正在尝试创建一个自定义组合框,其行为类似于此处的组合框:

我现在有两个问题:

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

当您从my widget中选择一种颜色,然后再次单击组合框,而不是显示所选项目及其相邻项目时,滚动窗口从顶部开始,没有明显的原因

这是代码,您几乎可以忽略uu加载u名称u调色板方法。您需要/usr/share/X11/rgb.txt文件来运行此代码,它如下所示:

问题是自我表现。此外,您不能有列表和换行宽度!=一,

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