kit de herramientas de GUI de Python de nivel superior, p. pase dict para TreeView / Grid

Comencé mi primer proyecto de mascota Python usando PyGTK. Aunque es un kit de herramientas GUI realmente poderoso y se ve excelente, tengo algunas molestias. Entonces pensé en hacer la transición a otra cosa, ya que aún no es demasiado extensa. Eché un vistazo aENTONCES ydocumentación de python, pero no obtuve una buena visión general.

Lo bueno de PyGTK:

Archivos Gladeself.signal_autoconnect ({...})self.get_widget () como __getattr__

Sin embargo, esto me está molestando:

manual gobject.idle_add (lambda: ... y False)Sin funcionalidad estándar para guardar estados de aplicación / ventanaTreeView necesita la construcción de matriceswidget.get_selection (). get_selected (), model.get_value (iter, liststore_index)

Vista de árbol: Debido a que este es el elemento principal de la interfaz, es el que más distrae. Básicamente, mi aplicación crea una lista de diccionarios para mostrar nombre = columna + fila => valor. Para mostrarlo usando GTK, debe haber un proceso de conversión manual, pedidos, tipos de letra. Esto parece un montón de gastos generales, y deseé algo más orientado a objetos aquí. PyGtk tiene muchas abstracciones sobre gtk + pero aún parece bastante bajo nivel. Prefiero pasar mi dict tal cual y tener columnas predefinidas de alguna manera. (GtkBuilder puede predefinir columnas TreeView, pero esto no resuelve la sobrecarga de representación de datos).

Cuando obtengo un clic en mi lista TreeView, también tengo que convertir todo de nuevo en las estructuras de datos de mi aplicación. Y también es molesto que PyGTK no envuelva las llamadas gtk + con gobject.idle, si se ejecuta desde un hilo no principal. En este momento hay una gran cantidad de código GUI que creo que no debería ser necesario o podría racionalizarse.

? Entonces, ¿hay quizás envoltorios adicionales en la parte superior de PyGTK? O qué otro kit de herramientas admite interfaces más simples para mostrar un Grid / TreeView. He leído mucho acerca de que wxPython es el favorito de todos, pero es menos maduro en Linux. YPyQT parece ser principalmente el mismo nivel de abstracción que PyGTK. No he usadoTkInter tanto, no sé si tiene interfaces más simples, pero de todos modos parece poco atractivo. Al igual quePyFLTK. El pijama suena fascinante, pero ya está demasiado alejado (aplicación de escritorio).

.

Entonces, kit de herramientas GUI con dict -> Pantalla de cuadrícula. ¿Cuál elegirías?

.

Como muestra, esta es mi función actual de mapeo TreeView. Más o menos funciona, pero preferiría tener algo estándar:

    #-- 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

Respuestas a la pregunta(4)

Su respuesta a la pregunta