Динамически добавлять или удалять элементы из списка и дерева в pygtk и быстро (поляна)
Я пытаюсь создать мини-CRM-приложение на python, используя gtk(pygtk), glade, и начал разрабатывать его с помощью быстрого (что здорово).
Я создал несколько диалогов и добавил просмотр списка в GUI, используя glade), но когда я пытаюсь добавить некоторые элементы в список динамически, из скрипта, который быстро создал glade, чтобы приложение показывало некоторые данные пользователю, вызвавшему MySql (если есть другая опция, я буду рад здесь о..) вместо этого он показывает много ошибок (в терминале).
Я искал некоторые учебные пособия, но все, что я нашел, это только статьи, которые объясняют, как создать список с нуля (не используя быстро, и поляна).
Вот код:
Это applicationWindow.py, который быстро создается
Я добавил базовый код для диалоговых окон кнопок и так...
import gettext
from gettext import gettext as _
gettext.textdomain('ubuntucrm')
from gi.repository import Gtk # pylint: disable=E0611
import logging
logger = logging.getLogger('ubuntucrm')
from ubuntucrm_lib import Window
from ubuntucrm.AboutUbuntucrmDialog import AboutUbuntucrmDialog
from ubuntucrm.PreferencesUbuntucrmDialog import PreferencesUbuntucrmDialog
from ubuntucrm.PopupcalendarDialog import PopupcalendarDialog
from ubuntucrm.NewcustomerDialog import NewcustomerDialog
from ubuntucrm.GlobalsearchDialog import GlobalsearchDialog
# See ubuntucrm_lib.Window.py for more details about how this class works
class UbuntucrmWindow(Window):
__gtype_name__ = "UbuntucrmWindow"
def finish_initializing(self, builder): # pylint: disable=E1002
"""Set up the main window"""
super(UbuntucrmWindow, self).finish_initializing(builder)
self.AboutDialog = AboutUbuntucrmDialog
self.PreferencesDialog = PreferencesUbuntucrmDialog
#self.PopupcalendarDialog = PopupcalendarDialog
# Code for other initialization actions should be added here.
self.CalendarButton = self.builder.get_object("CalendarButton")
self.contactsButton = self.builder.get_object("contactsButton")
self.productsButton = self.builder.get_object("productsButton")
self.OtherButton = self.builder.get_object("OtherButton")
#dialogs
self.cal = PopupcalendarDialog()
self.contactsDialog = NewcustomerDialog()
self.globalsearcher = GlobalsearchDialog()
#lists and modelers
self.leftTree = self.builder.get_object("leftTreeview")
self.treeModeler = self.builder.get_object("liststorer1")
#functions
def on_OtherButton_clicked(self, widget):
print "you clicked OtherButton"
// здесь я попробовал что-то вроде:
self.treeModeler.append(["bla bla","some text"])
// например, "бла бла", загруженный из базы данных MySQL.
def on_productsButton_clicked(self, widget):
print "you clicked producs button"
self.globalsearcher.run()
def on_contactsButton_clicked(self, widget):
print "you clicked contactButton "
self.contactsDialog.run()
def on_CalendarButton_clicked(self, widget):
print "calling to calendar button"
self.cal.run()
Ошибка:
(ubuntucrm:10443): Gtk-CRITICAL **: gtk_list_store_get_value: assertion `column < priv->n_columns' failed
и порядок неверный
| некоторый текст | бла бла |
вместо:
| бла бла | некоторый текст |
2 ответа
Всегда предоставляйте полную обратную трассировку и дополнительные предупреждения / вывод. Тем не менее, ваша проблема в следующей строке кода:
self.treeModeler.append("bla bla")
Вы должны предоставить список элементов, который соответствует столбцам в Gtk.TreeModel
, Поэтому, если ваша модель имеет только 1 строковый столбец, просто заключите несколько скобок в строку:
self.treeModeler.append(["bla bla"])
У вас есть больше столбцов с разными типами? Укажите их в своем списке:
self.treeModeler.append(["bla bla", 1234, False, 1.234, GdkPixbuf.Pixbuf, None])
Изменить для редактирования: Помните, что вы добавляете значения в Gtk.TreeModel
столбцы, а не Gtk.TreeView
колонны. Посмотрите мои скриншоты в этом ответе и убедитесь, что вы нанесли на карту каждый Gtk.TreeModel
столбец к правильному Gtk.CellRendererText
,
Я получил эту ошибку, когда у меня был GtkCellRendererText text
атрибут установлен в нулевой индекс для столбца, который не существует.