GTK TreeView с ListStore ничего не отображает. Используются Python и SQLite3

Я использую GTK и Python для разработки приложения. Я хочу загрузить элементы TreeView (1 столбец) из базы данных SQLite3. Но что-то пошло не так (без ошибок)! Вот весь код:

#!/usr/bin/python
import sys
import sqlite3 as sqlite
from gi.repository import Gtk
from gi.repository import Notify

def notify(notifer, text, notificationtype=""):
    Notify.init("Application")
    notification = Notify.Notification.new (notifer, text, notificationtype)
    notification.show ()

def get_object(gtkname):
    builder = Gtk.Builder()
    builder.add_from_file("main.ui")
    return builder.get_object(gtkname)

def base_connect(basefile):
    return sqlite.connect(basefile)

class Handler:

    def main_destroy(self, *args):
        Gtk.main_quit(*args)

    def hardwaretool_clicked(self, widget):
        baselist = get_object("subjectlist")
        baselist.clear()
        base = base_connect("subjectbase")
        with base:
            cur = base.cursor()
            cur.execute("SELECT * FROM sub")
            while True:
                row = cur.fetchone()
                if row == None:
                    break
                iter = baselist.append()
                print "row ", row[0]
                baselist.set(iter, 0, row[0])
            cur.close()

    def gamestool_clicked(self, widget):
        print("gamestool clicked!!!!! =)")

    def appstool_clicked(self, widget):
        print("appstool clicked!!!!! =)")

    def fixtool_clicked(self, widget):
        notify("Charmix","Fix Applied", "dialog-ok")

    def brokenfixtool_clicked(self, widget):
        notify("Charmix","Broken Fix Report Sended", "dialog-error")

    def sendfixtool_clicked(self, widget):
        notify("Charmix","Fix Sended", "dialog-information")

class CharmixMain:

    def __init__(self):

        builder = Gtk.Builder()
        builder.add_from_file("main.ui")

        self.window = builder.get_object("main")

        self.subject = builder.get_object("subjectlist")
        self.problem = builder.get_object("problemlist")

        self.toolbar = builder.get_object("toolbar")
        self.hardwaretool = builder.get_object("hardwaretool")
        self.gamestool = builder.get_object("gamestool")
        self.appstool = builder.get_object("appstool")
        self.fixtool = builder.get_object("fixtool")
        self.brokenfixtool = builder.get_object("brokenfixtool")
        self.sendfixtool = builder.get_object("sendfixtool")

        builder.connect_signals(Handler())

        context = self.toolbar.get_style_context()
        context.add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR)

if __name__ == "__main__":
    Charmix = CharmixMain()
    Charmix.window.show()
    Gtk.main()

Меня интересует эта часть (не работает нормально):

def hardwaretool_clicked(self, widget):
        baselist = get_object("subjectlist")
        baselist.clear()
        base = base_connect("subjectbase")
        with base:
            cur = base.cursor()
            cur.execute("SELECT * FROM sub")
            while True:
                row = cur.fetchone()
                if row == None:
                    break
                iter = baselist.append()
                print "row ", row[0]
                baselist.set(iter, 0, row[0])
            cur.close()

TreeView(subjecttree) ничего не отображает, но print "row ", row[0] работает нормально и отображает все строки.

Пожалуйста помогите. Может быть, мне нужно перекрасить TreeView или что-то в этом роде? Знаете, как я могу его получить?


person Bogdan    schedule 22.01.2013    source источник
comment
Прежде чем идти дальше, вы должны поставить меньший (минимальный) тестовый пример. В вашем текущем коде часть уведомлений не имеет смысла, как и все эти неиспользуемые виджеты (например, с событием _clicked). Кроме того, вы можете поместить минимальные виджеты в код вместо ссылки на файл, содержимое которого вы не отправляли (main.ui).   -  person gpoo    schedule 23.01.2013


Ответы (1)


Проблема в вашем методе get_object.

Когда вы делаете:

builder = Gtk.Builder()
builder.add_from_file("main.ui")

на самом деле вы создаете новое окно; даже если вы используете тот же файл пользовательского интерфейса, вы создаете совершенно другой виджет.

Один из способов обойти проблему доступа к виджетам, которые необходимо обработать с помощью обработчика, — передать их в качестве параметра конструктора:

class Handler(object):
    def __init__(self, widget1, widget2):
        self.widget1 = widget1
        self.widget2 = widget2
...

Впоследствии вы можете использовать эти виджеты в методе обработчика.

Другой способ получить доступ к виджетам более «развязанным» способом — добавить объект, который вы хотите использовать, в качестве последнего параметра метода connect при подключении сигналов; недостатком является то, что вам придется делать это вручную (поскольку Glade не предоставляет такой возможности)

self.widget.connect('some-signal', handler.handler_method, object_to_use)
person asermax    schedule 23.01.2013