высокоуровневый Python инструментарий GUI, например, передача dict для TreeView/Grid

Запущенный мое первое использование проекта домашнего животного Python PyGTK. Хотя это - действительно мощный инструментарий GUI и выглядит превосходным, у меня есть некоторые главные объекты неприязни. Таким образом, я думал о переходе к чему-то еще, поскольку это еще не слишком обширно. Взглянувший вокруг на ТАК и документация Python, но не получил хороший обзор.

Что хорошо о PyGTK:

  • Файлы поляны
  • сам signal_autoconnect ({...})
  • сам get_widget () как __ getattr __

Это прослушивает меня однако:

  • руководство gobject.idle_add (лямбда:... и Ложь)
  • никакая стандартная функциональность для сохранения состояний приложения/окна
  • TreeView нужно здание массива
  • виджет get_selection () .get_selected (), модель get_value (проход, liststore_index)

TreeView: Поскольку это - основной интерфейсный элемент, это является самым недовольным. В основном мое приложение создает список словарей, которые будут отображены name=column+row => значение. Для отображения его с помощью GTK должен быть ручной процесс преобразования, упорядочивание, преобразования типа. Это кажется большим количеством издержек, и я желал чего-то более объектно-ориентированного здесь. PyGtk имеет много абстракций на gtk +, но все еще кажется довольно низким-levelish. Я предпочел бы передавать свой dict как есть и предопределять столбцы так или иначе. (GtkBuilder может предопределить столбцы TreeView, но это не решает представление данных наверху.)

Когда я получаю mousclick в своем списке TreeView, я также должен преобразовать все назад в мои структуры данных приложения. И это также надоедливо, что PyGTK не переносит gtk + вызовы с самим gobject.idle, если выполнено от неосновного потока. Прямо сейчас существует много кода GUI, которому я верю, не должно быть необходимым, или мог быть рационализирован далеко.

? Так, есть ли, возможно, дополнительные обертки сверху PyGTK. Или который другой инструментарий поддерживает более простые интерфейсы для отображения Сетки / TreeView. Я читал много о wxPython, являющемся everyones фаворит, но это является менее сформировавшимся на Linux. И PyQT, кажется, главным образом тот же уровень абстракции как PyGTK. Не использовали TkInter очень, так не знайте о том, если он имеет более простые интерфейсы, но это так или иначе выглядит непривлекательным. Как делает PyFLTK. PyJamas звучит захватывающим, но уже слишком далек (Настольное приложение).

.

Так, инструментарий 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

5
задан Community 23 May 2017 в 12:01
поделиться

3 ответа

Может, попробовать Киви ? Особенно с его ObjectList .

Обновление: я думаю, что разработка Kiwi перенесена на PyGTKHelpers .

5
ответ дан 18 December 2019 в 14:42
поделиться

Я бы посоветовал взглянуть на wxPython . Я обнаружил, что это действительно легко подобрать и очень мощно, хотя я должен признать, что сам мало что сделал с Treeviews.

wxWidgets вызывает эквивалентный элемент управления a wxTreeCtrl

[Edit] wxDataViewTreeCtrl может быть более полезным в вашем случае.

1
ответ дан 18 December 2019 в 14:42
поделиться

Раньше я не встречал Kiwi. Спасибо, Йоханнес Сасонко.

Вот еще несколько дублеров, которые я помечал. Некоторые из них являются оболочками для других наборов инструментов (GTK, wxWidgets), а другие - автономными:

(Я включил несколько из них, которые уже упоминались для других, кто наткнулся на этот пост. Я бы опубликовал это как комментарий, но это немного слишком долго.)

4
ответ дан 18 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: