Динамическая установка выбранного свойства строки в TreeView в Gtk3 (python)

Это та же проблема, что и в моем предыдущем вопросе, но я перешел на python3 /gtk3, чтобы иметь возможность использовать CSS для установки основных свойств.

Из файла питона:

self.w = Gtk.Window()
self.w.set_name("App")

Я могу использовать css:

#App GtkTreeView row:selected {
    border-color: #000000;
    border-top-width: 1px;
    border-bottom-width: 1px;
    color: #000;
}

И легко навсегда изменить стиль выделения. Для меня это означает, что я должен иметь возможность динамически получать доступ к объекту row и его стилю, где я мог бы установить bg для Gtk.StateFlags.SELECTED.

Я пробовал кучу странных способов, например (где bg_color - это Gdk.Color, который отлично работает, например, для изменения стиля Label вне TreeView).

        style=self.treeview.get_style_context()
        col = style.get_background_color(Gtk.StateFlags.SELECTED)
        col.alpha =  1.0
        col.blue = bg_color.blue
        col.red = bg_color.red
        col.green = bg_color.green

Or:

        style = self.treeview.get_style().copy()
        style.bg[Gtk.StateFlags.SELECTED] = bg_color
        self.treeview.set_style(style)

(выдает ошибку: style.bg[Gtk.StateFlags.SELECTED] = bg_color IndexError: list assignment index out of range)

и так далее...

Итак, пожалуйста, как мне найти способ динамически изменять эффект выделения в зависимости от нормального цвета строки? Или, другими словами, как мне найти путь к объекту, который на самом деле содержит настройку стиля для выделения?


person deinonychusaur    schedule 01.11.2012    source источник


Ответы (1)


У меня была последняя идея о том, как это можно сделать после публикации, которая фактически сработала:

Динамическая перезагрузка css:

В css я добавил строку, оставив значение фона открытым для динамической замены:

#App GtkTreeView row:selected {
    border-color: #400;
    border-top-width: 2px;
    border-bottom-width: 2px;
    background: {0};
    color: #000;
}

Затем я загрузил css в python:

    screen = Gdk.Screen.get_default()
    self._css_provider = Gtk.CssProvider()
    css = open("notify_stack.css", 'rb')
    self._css = css.read()
    css.close()
    self._css_from = bytes("{0}".encode("utf8"))
    self._css_provider.load_from_data(self._css.replace(
        self._css_from,   
        bytes("#fff".encode("utf8"))))
    context = Gtk.StyleContext()
    context.add_provider_for_screen(screen, self._css_provider,
        Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

Позже в обратном вызове для выбора строки я помещаю эту строку (data — это мой ListStore):

        self._css_provider.load_from_data(
            self._css.replace(self._css_from,
                bytes(data[rows[0]][self.BG_COLOR].encode("utf8"))))

Это кажется очень грубым, должен быть более приятный способ, но, эй, это действительно сработало.

person deinonychusaur    schedule 02.11.2012