Python (GTK): Может кто-нибудь объяснить разницу между TreeStore, Listmodel и всем остальным?
Я пытаюсь разобраться в следующих концепциях, но вся документация, которую я прочитал, объединяет всю совокупность вместе, не объясняя, что на самом деле такое, и в результате я не знаю, как правильно использовать их , Если бы кто-то мог дать какую-то реальную аналогию, которая бы очень помогла.
TreeView ListView (это даже вещь?) TreeStore ListStore TreeModel TreeIter
- Python SQLAlchemy и Postgres - как запросить элемент JSON
- Ошибка: нет модуля с именем psycopg2.extensions
- Должен ли я использовать orbited или gevent для интеграции функциональности кометы в приложение django
- База данных Postgresql случайно падает
- не удалось создать автоинкрементный первичный ключ с фляжкой-sqlalchemy
Моя конечная цель – прочитать набор результатов из базы данных и отобразить их в виджетах как элементы, доступные для кликов. У меня есть поиск и поиск деталей, но передача результатов назад, отображение их и получение их для обновления оказалось намного более сложным.
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 на этот раз.
- SQLAlchemy, PostgreSQL и array_agg: как выбрать элементы из array_agg?
- psycopg2 как обращаться с TypeError: не все аргументы, преобразованные во время форматирования строки
- Ошибка при запуске «python manage.py syncdb» локально, но без ошибок при выполнении той же команды через Heroku
- Ошибка: невозможно найти vcvarsall.bat при установке psycopg2 в windows7
- юг: не может ALTER TABLE, поскольку он имеет ожидающие события триггера
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 для хранения своих данных (а также для рендеринга данных использует средства отображения ячеек).
- если y> 0.0 и x -y> = – Q1: ValueError: значение истинности массива с более чем одним элементом неоднозначно. Используйте команды a.any () или a.all ()
- pybuilder и pytest: не могут импортировать исходный код при выполнении тестов