2012-11-01 39 views
0

这与my previous问题中的问题相同,但我转移到python3/gtk3以便能够使用css设置基本属性。在Gtk3中动态设置Row的选定属性(python)

从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对象及其样式,我可以为Gtk.StateFlags.SELECTED设置bg

我已经尝试了一堆怪异的方式,e.g(其中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 

或者:

 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

诸如此类......

所以,请我怎么找到这取决于动态改变选择效应的方法在行的正常颜色?或者换句话说,我如何找到实际上包含选择样式设置的对象?

回答

0

我对如何才能发布之后完成最后一个想法,实际上结束了工作:

重装动态的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")))) 

那感觉真是畜生,必须有一个更好的方式,但嘿它实际工作。