0

这与我上一个问题中的问题相同,但我转向 python3/gtk3 以便能够使用 css 来设置基本属性。

从python文件:

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-object 及其样式,我可以在其中bg设置Gtk.StateFlags.SELECTED.

我尝试了一堆奇怪的方法,例如(在哪里bg_color可以Gdk.Color正常工作,例如更改 aLabel外部的样式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

或者:

        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:)

等等……

那么请问,如何找到根据行的正常颜色动态更改选择效果的方法?或者换句话说,我如何找到实际保存选择的样式设置的对象的方式?

4

1 回答 1

2

在发布后,我有一个关于如何完成的最后一个想法,它实际上最终起作用了:

动态重新加载css:

在 css 中,我添加了一行,将背景的值留给动态替换:

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

然后我在python中加载了css:

    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"))))

感觉真的很野蛮,一定有更好的方法,但是嘿,它确实有效。

于 2012-11-02T00:22:17.060 回答