2012-11-01 33 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")))) 

那感覺真是畜生,必須有一個更好的方式,但嘿它實際工作。