LINUX.ORG.RU

[pygtk] При переопределении обработчика сигнала по умолчанию не передается ссылка на экземпляр класса

 


0

1

Приветствую.

При написании виджета отображающего дерево директорий в файловой системе (основанного на gtk.TreeView) столкнулся со следующей проблемой. При переопределении сигнала row-expanded в мой новый обработчик не передается ссылка на экземляр класса (т.е. self):

TypeError: do_row_expanded() takes exactly 4 arguments (3 given)
Вот код
class DirectoryTree(gtk.TreeView):
    __gsignals__ = {
        "row-expanded": "override"
    }

    def __init__(self, default_path=None, show_hidden=False):
        model = gtk.TreeStore(str, str, str)
        super(DirectoryTree, self).__init__(model)
        self.__show_hidden = show_hidden
        self.__default_path = default_path
        
        column = gtk.TreeViewColumn()
        
        renderer = gtk.CellRendererPixbuf()
        column.pack_start(renderer, False)
        column.set_attributes(renderer, icon_name=1)
        renderer = gtk.CellRendererText()
        column.pack_start(renderer, True)
        column.set_attributes(renderer, text=2)
        
        self.set_headers_visible(False)
        self.append_column(column)

        self.__fill_model()
    
    def __fill_model(self, iter=None):
        model = self.get_model()
        if iter is None:
            path = "/"
        else:
            path = model.get_value(iter, 0)

        dircont = os.listdir(path)
        dircont.sort()
        for i in dircont:
            # Not show hidden items if we not want them
            if i.startswith(".") and not self.__show_hidden:
                continue
            abspath = os.path.join(path, i)
            if os.path.isdir(abspath):
                if abspath == os.environ.get("HOME"):
                    icon = "user-home"
                else:
                    icon = "folder"
                try:
                    os.listdir(abspath)
                except OSError:
                    icon = "error"
                newiter = model.append(iter, (abspath, icon, i))
                # Create fake subitem for lazy treeview
                if icon != "error":
                    model.append(newiter)
                gtk.main_iteration(False)

    def do_row_expanded(self, widget, iter, path):
        model = self.get_model()
        model.set_value(iter, 1, "folder-open")
        child = model.iter_children(iter)
        if model.get_value(child, 0) is None:
            self.__fill_model(iter)
            model.remove(child)
Причем если не мудрить с gobject'ом, а просто взять и присоединить обработчик с помощью connect(), то все работает. В чем проблема? Обработчик по умолчанию для данного сигнала нельзя переопределять?

И еще один вопрос по ходу. Насколько оправдано для виджетов такого рода использовать GIO? Если оправдано, то где можно посмотреть нормальных примеров использования GIO?

★★★★★

def do_row_expanded(self, widget, iter, path):

widget лишний, он будет self'ом, как раз.

Насколько оправдано для виджетов такого рода использовать GIO?

GIO, берет на себя кучу работы по определению типа файла, можно на халяву получить иконку, вообще кучу мета информации. Если она нужна, то gio однозначно хороший выбор.

то где можно посмотреть нормальных примеров использования GIO?

Мои шишки

Можешь глянуть FileList.get_pixbuf и FileList.fill. И естественно задавать вопросы здесь. Постараюсь ответить.

baverman ★★★
()
Ответ на: комментарий от baverman

>widget лишний, он будет self'ом, как раз.

Действительно, без него все работает. Но почему тогда в документации написано, что первой передается ссылка на сам виджет? Да ведь и при connect() все работает, странно оно как то…

можно на халяву получить иконку, вообще кучу мета информации.


Вот это как раз и нравится, но укуренная документация и почти полное отсутствие вменяемых примеров использования, несколько отпугивают от GIO.

Кстати насколько ужасным будет одновременное использование os и gio?

fat_angel ★★★★★
() автор топика
Ответ на: комментарий от fat_angel

Да ведь и при connect() все работает, странно оно как то…

В коннект передается ссылка на метод экземпляра, у которого фактическая сигнатура не содержит селф.

do_* же вызываются напрямую из кишков pygtk, и есть возможность явно передать виджет в качестве self, тем более, другое поведение смысла не имеет вообще, ведь по семантике ACTION сигналы как раз и являются перегружаемыми методами.

Кстати насколько ужасным будет одновременное использование os и gio?

Я считаю, что рабочий софт с «плохим» кодом лучше, чем ненаписанный с гипотетическим «хорошим».

baverman ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.