Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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 GUI工具包,例如用于TreeView/Grid的pass dict_Python_User Interface_Gtk_Pygtk - Fatal编程技术网

更高级别的Python GUI工具包,例如用于TreeView/Grid的pass dict

更高级别的Python GUI工具包,例如用于TreeView/Grid的pass dict,python,user-interface,gtk,pygtk,Python,User Interface,Gtk,Pygtk,使用PyGTK启动了我的第一个Python宠物项目。虽然这是一个非常强大的GUI工具包,看起来非常棒,但我还是有些恼火。所以我考虑过渡到其他方面,因为它还不太广泛。在和上四处查看了一下,但没有得到很好的概述 PyGTK的优点是: 林间空地档案 自信号自动连接({…}) self.get_widget()作为u_getattr__ 然而,这让我感到烦恼: 手动gobject.idle_add(lambda:…和False) 没有保存应用程序/窗口状态的标准功能 TreeView需要构建阵列

使用PyGTK启动了我的第一个Python宠物项目。虽然这是一个非常强大的GUI工具包,看起来非常棒,但我还是有些恼火。所以我考虑过渡到其他方面,因为它还不太广泛。在和上四处查看了一下,但没有得到很好的概述

PyGTK的优点是:

  • 林间空地档案
  • 自信号自动连接({…})
  • self.get_widget()作为u_getattr__
然而,这让我感到烦恼:

  • 手动gobject.idle_add(lambda:…和False)
  • 没有保存应用程序/窗口状态的标准功能
  • TreeView需要构建阵列
  • widget.get_selection().get_selected(),model.get_value(iter,liststore_索引)
TreeView:因为这是主要的界面元素,所以它最让人分心。基本上,我的应用程序构建了一个要显示的字典列表name=column+row=>value。要使用GTK显示它,需要手动转换过程、排序和类型转换。这似乎有很多开销,我希望这里有更多面向对象的东西。PyGtk在gtk+上有许多抽象,但看起来仍然相当低级。我更喜欢按原样通过dict,并以某种方式预定义列。(GtkBuilder可以预定义TreeView列,但这并不能解决数据表示开销问题。)

当我在TreeView列表上点击鼠标时,我还必须将所有内容转换回我的应用程序数据结构。而且,如果从非主线程运行,PyGTK不会将gtk+调用包装为gobject.idle本身,这也是令人讨厌的。现在有很多GUI代码我认为不必要,或者可以合理化

那么,PyGTK上面是否还有其他包装。或者哪个其他工具包支持更简单的界面来显示网格/树视图。我读过很多关于wxPython是每个人的最爱的文章,但是它在Linux上还不太成熟。而PyQT似乎与PyGTK的抽象级别基本相同。没有太多地使用TkInter,所以不知道它是否有更简单的接口,但它看起来没有吸引力。与PyFLTK一样。睡衣听起来很吸引人,但已经太远了(桌面应用程序)

因此,GUI工具包带有dict->网格显示。你会选哪一个

如图所示,这是我当前的TreeView映射函数。有点不错,但我更喜欢标准的东西:

    #-- fill a treeview
    #
    # Adds treeviewcolumns/cellrenderers and liststore from a data dictionary.
    # Its datamap and the table contents can be supplied in one or two steps.
    # When new data gets applied, the columns aren't recreated.
    #
    # The columns are created according to the datamap, which describes cell
    # mapping and layout. Columns can have multiple cellrenderers, but usually
    # there is a direct mapping to a data source key from entries.
    #
    # datamap = [  #  title   width    dict-key    type,  renderer,  attrs  
    #               ["Name",   150,  ["titlerow",   str,    "text",    {} ]  ],
    #               [False,     0,   ["interndat",  int,     None,     {} ]  ],
    #               ["Desc",   200,  ["descriptn",  str,    "text",    {} ],  ["icon",str,"pixbuf",{}]  ],
    #
    # An according entries list then would contain a dictionary for each row:
    #   entries = [ {"titlerow":"first", "interndat":123}, {"titlerow":"..."}, ]
    # Keys not mentioned in the datamap get ignored, and defaults are applied
    # for missing cols. All values must already be in the correct type however.
    #
    @staticmethod
    def columns(widget, datamap=[], entries=[], pix_entry=False):

        # create treeviewcolumns?
        if (not widget.get_column(0)):
            # loop through titles
            datapos = 0
            for n_col,desc in enumerate(datamap):

                # check for title
                if (type(desc[0]) != str):
                    datapos += 1  # if there is none, this is just an undisplayed data column
                    continue
                # new tvcolumn
                col = gtk.TreeViewColumn(desc[0])  # title
                col.set_resizable(True)
                # width
                if (desc[1] > 0):
                    col.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
                    col.set_fixed_width(desc[1])

                # loop through cells
                for var in xrange(2, len(desc)):
                    cell = desc[var]
                    # cell renderer
                    if (cell[2] == "pixbuf"):
                        rend = gtk.CellRendererPixbuf()  # img cell
                        if (cell[1] == str):
                            cell[3]["stock_id"] = datapos  # for stock icons
                            expand = False
                        else:
                            pix_entry = datapos
                            cell[3]["pixbuf"] = datapos
                    else:
                        rend = gtk.CellRendererText()    # text cell
                        cell[3]["text"] = datapos
                        col.set_sort_column_id(datapos)  # only on textual cells

                    # attach cell to column
                    col.pack_end(rend, expand=cell[3].get("expand",True))
                    # apply attributes
                    for attr,val in cell[3].iteritems():
                        col.add_attribute(rend, attr, val)
                    # next
                    datapos += 1

                # add column to treeview
                widget.append_column(col)
            # finalize widget
            widget.set_search_column(2)   #??
            widget.set_reorderable(True)

        # add data?
        if (entries):
            #- expand datamap            
            vartypes = []  #(str, str, bool, str, int, int, gtk.gdk.Pixbuf, str, int)
            rowmap = []    #["title", "desc", "bookmarked", "name", "count", "max", "img", ...]
            if (not rowmap):
                for desc in datamap:
                    for var in xrange(2, len(desc)):
                        vartypes.append(desc[var][3])  # content types
                        rowmap.append(desc[var][0])    # dict{} column keys in entries[] list
            # create gtk array storage
            ls = gtk.ListStore(*vartypes)   # could be a TreeStore, too

            # prepare for missing values, and special variable types
            defaults = {
                str: "",
                unicode: u"",
                bool: False,
                int: 0,
                gtk.gdk.Pixbuf: gtk.gdk.pixbuf_new_from_data("\0\0\0\0",gtk.gdk.COLORSPACE_RGB,True,8,1,1,4)
            }
            if gtk.gdk.Pixbuf in vartypes:
                pix_entry = vartypes.index(gtk.gdk.Pixbuf) 

            # sort data into gtk liststore array
            for row in entries:
                # generate ordered list from dictionary, using rowmap association
                row = [   row.get( skey , defaults[vartypes[i]] )   for i,skey   in enumerate(rowmap)   ]

                # autotransform string -> gtk image object
                if (pix_entry and type(row[pix_entry]) == str):
                    row[pix_entry] = gtk.gdk.pixbuf_new_from_file(row[pix_entry])

                # add
                ls.append(row)   # had to be adapted for real TreeStore (would require additional input for grouping/level/parents)

            # apply array to widget
            widget.set_model(ls)
            return ls

        pass
。虽然我不得不承认我自己在Treeviews上做得不多,但我发现它确实很容易掌握,而且非常强大

wxWidgets调用等效控件a

[Edit]在您的情况下,该选项实际上可能更有用。

试试看,也许?尤其是它的


更新:我认为猕猴桃的发展已经转移到了。

我以前从未见过猕猴桃。谢谢,Johannes Sasongko

这里还有一些我保留的书签。其中一些是其他工具包(GTK、wxWidgets)的包装,而另一些是独立的:


(为了其他看到这篇文章的人,我已经包括了一些已经提到的内容。我本想把这篇文章作为评论发布,但有点太长了。)

另请参见

这是如何回答他的问题的?虽然我已经有一段时间没有使用这两个库了,但我觉得PyGTK比wxPython更高级。我在wxTreeCtrl文档中没有看到任何建议您可以这样做的内容,例如,只需传递一本字典就可以了。这并不像我第一次想的那样有用。我肯定我在wxPython网站上看到过这样的例子,但现在我找不到了:-/我无论如何都要调查一下。WX使用GTK作为后端,所以至少不能是视觉降级。但由于它是compat包装器,所以它可能是公共分母抽象级别。但是,我最感兴趣的是TreeView API。只是还没有看到相关的文件…我得买些票。还有一些可以痛打我自己的东西。事实上,我以前读过关于猕猴桃的书,但不知怎么的,在实施的时候忽略了它。这正是我想要的。只需检查一下是否可以像信号回调一样获取ObjectList内容。列表中的要点非常好。我以前见过Dabo,它看起来非常高级,特别是在treeview/grid上提供了一个数据视图。但是,找不到真正的API文档,所以我不确定UI组件是否可以独立于数据库源使用。AVC听起来更好!AVC是python语言图形界面小部件和应用程序变量之间的多平台、全自动实时连接