Python (GTK): Может кто-нибудь объяснить разницу между TreeStore, Listmodel и всем остальным?

Я пытаюсь разобраться в следующих концепциях, но вся документация, которую я прочитал, объединяет всю совокупность вместе, не объясняя, что на самом деле такое, и в результате я не знаю, как правильно использовать их , Если бы кто-то мог дать какую-то реальную аналогию, которая бы очень помогла.

TreeView ListView (это даже вещь?) TreeStore ListStore TreeModel TreeIter

Моя конечная цель – прочитать набор результатов из базы данных и отобразить их в виджетах как элементы, доступные для кликов. У меня есть поиск и поиск деталей, но передача результатов назад, отображение их и получение их для обновления оказалось намного более сложным.

update: Следующее предназначено для чтения результатов из базы данных postgreSQL и размещения его в «контейнере», откуда я могу назначить результаты выходному диалоговому окну:

result = self.lookup_player(search) # this returns a result of cur.fetchall print result # just to make sure it returns the right things if len(result) > 0: # make sure there are results for i in range(0, len(result)): # i used treeiter to see what it did treeiter=store.append([result[i][0],result[i][1],str(result[i][4])]) print result[i][0],result[i][1],result[i][2],result[i][3],result[i][4],result[i][5],result[i][6],result[i][7],result[i][8],result[i][9],result[i][10] else: print "No players found" 

Я использовал ListStore в приведенном выше примере, поскольку он казался наиболее подходящим. Но, возможно, я должен был использовать Treestore, или простой список, или массив … Легко понять, что такое строка, или целое число, float, но что на самом деле выглядят эти списки / tree / model / stores или делать?

Мне пришлось отказаться от кодирования в C лет назад, так как я просто не мог понять, что такое полиморфный связанный список, и я отчаянно хочу избежать такой же участи с python на этот раз.

One Solution collect form web for “Python (GTK): Может кто-нибудь объяснить разницу между TreeStore, Listmodel и всем остальным?”

У вас есть правильная идея с вашим кодом GtkListStore выше: это хранилище данных, которое очень похоже на таблицу SQL. Фактически вы обнаружите, что инфраструктура GtkTreeView работает как таблицы SQL. Ваш Gtk.ListStore() конструктора Gtk.ListStore() отображается непосредственно в CREATE TABLE а ваш вызов append() отображается непосредственно в INSERT ROW .

Важно отметить, что столбцы в вашем GtkListStore нумеруются слева направо, начиная с 0, а не с именем. Это будет очень важно.

Разница между GtkListStore и GtkTreeStore заключается в том, что последний позволяет вам иметь строки в виде дочерних элементов других строк, например дерево папок в файловом браузере. Строки детей должны иметь тот же формат столбцов, что и родительские строки.

Оба GtkListStore и GtkTreeStore являются реализациями GtkTreeModel, который является интерфейсом . Из того, что мне сказали, у Python нет непосредственной концепции, такой как интерфейсы, поэтому представьте себе интерфейс как абстрактный базовый класс, где нет реализаций по умолчанию и каждая функция должна быть определена. GtkTreeModel указывает методы, которые позволяют GtkTreeView отображать данные на экране.

Итак, теперь единственный вопрос: как подключить GtkTreeView к GtkTreeModel / GtkListStore / GtkTreeStore?

Как вы помните из SQL, каждый столбец таблицы имеет определенный тип данных. С GtkTreView все ячейки в столбце имеют один и тот же рендеринг соты . Средство визуализации ячеек рисует текст, изображения, флажки и т. Д., Используя свойства GObject. Вероятно, вы уже использовали свойства: text является свойством в GtkLabels, active является свойство в GtkCheckButtons и т. Д. У визуализаторов ячеек есть свойства, которые не только определяют, какие данные нужно рисовать, но и как рисовать.

Когда вы добавляете «атрибуты» (в имени функции) в GtkTreeViewColumn (представление одного столбца в GtkTreeView), вы предоставляете вызываемую вами функцию для подачи двух вещей: самого рендеринга ячеек и списка атрибутов пары пар полюсов.

Например, предположим, что колонка 0 модели таблицы должна содержать текст для первого столбца. Вот как вы могли бы создать столбец:

 renderer = Gtk.CellRendererText() # create a text cell renderer column = Gtk.TreeViewColumn("Column") # create the column column.pack_start(renderer, True) # load the renderer... column.add_attribute(renderer, "text", 0) # ...and tell it to get its text from the first column of the model 

Теперь все, что осталось, – добавить столбцы в GtkTreeView и установить GtkListStore как модель GtkTreeView (с помощью set_model() ). Если все пойдет хорошо, вы должны увидеть свои данные в GtkTreeView.


GtkTreeView не предоставляет собственные полосы прокрутки. Обязательно поместите свой GtkTreeView в GtkScrolledWindow, чтобы получить их.

Существует GtkListBox, но он совершенно не связан с этим.

Надеюсь, это поможет разобраться! Если нет, не стесняйтесь указать, что вы не понимаете, и я соответствующим образом поправлю этот ответ.


Обновление . В ответ на ваш комментарий спрашивают, почему GtkTreeView работает именно так, вместо того, чтобы управлять всеми add_row() данными и просто иметь такие функции, как add_row() и set_cell_value() . Для этого дизайна есть несколько преимуществ:

  • Это делает собственный код GtkTreeView более простым и расширяемым в будущем.
  • Это позволяет людям с особыми потребностями реализовать собственный GtkTreeModel для использования в качестве хранилища данных. Например, кто-то, пишущий достаточно продвинутую или голографическую программу, может создать GtkTreeModel, который напрямую связывается с базой данных SQL, избегая необходимости копировать данные повсюду.
  • Он позволяет использовать одно и то же хранилище данных несколькими экземплярами GtkTreeView.
  • Он позволяет использовать тот же хранилище данных другими виджетами. GtkIconView – еще один виджет, который использует GtkTreeModel для хранения своих данных (а также для рендеринга данных использует средства отображения ячеек).
  • Невозможно настроить параметры приложения Django / Postgres на Heroku
  • Настройка производительности Postgresql и использования памяти в рабочем процессе python
  • Как выполнить запрос в Odoo-8 из Python?
  • Django ORM & hstore: подсчет уникальных значений ключа
  • SqlAlchemy: получение идентификатора последней записи
  • Ошибка установки python pip psycopg2
  • ошибка установки psycopg2, библиотека не найдена для -lssl
  • Heroku / Django: нет модуля с именем dj_database_url
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.