Приветствую.
При написании виджета отображающего дерево директорий в файловой системе (основанного на 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)
И еще один вопрос по ходу. Насколько оправдано для виджетов такого рода использовать GIO? Если оправдано, то где можно посмотреть нормальных примеров использования GIO?