2013-01-07 48 views
2

對不起,如果這是轉發,我無法在任何地方找到答案。我正在Python和GTK + 3中開發一個應用程序,它有一個被設置爲INSENSITIVE的TreeView。這禁止我們的用戶在常量表上直接選擇。但INSENSITIVE GTK + 3小部件的默認行爲是遮蔽不敏感對象。在大多數情況下,這是一個很好的行爲,但在我的情況下,我需要我的桌子保持清晰易讀。GTK + 3:如何渲染INSENSITIVE窗口小部件的風格爲NORMAL窗口部件

我想要做的是能夠重寫此特定INSENSITIVE對象的呈現以匹配NORMAL對象的呈現。然後,如果用戶更改GTK主題,則此特定的INSENSITIVE小部件將像正常小部件一樣呈現。

我附上了一些簡單的代碼來說明我的觀點......

import gi.repository.Gtk as Gtk 
import gi.repository.Gdk as Gdk 

class Example(Gtk.Window): 

    def __init__(self): 
     """A minimal example of the rendering of a INSENSITIVE widget""" 

     # Use Gtk.Window __init__ method 
     Gtk.Window.__init__(self) 

     # Add a box 
     self.set_title("Example1") 
     self.box = Gtk.Box() 
     self.add(self.box) 

     # Entry widget 
     self.entry = Gtk.Entry() 
     self.entry.set_text("Can't touch this") 
     self.entry.set_sensitive(False) 
     self.box.pack_start(self.entry, True, True, 0) 


class Example2(Example): 

    def __init__(self): 
     """Forced recoloring of the INSENSITIVE widget. How do I do 
     this so that it matches the GTK 3+ style for normal text? 
     """ 

     # Use Example __init__ method 
     Example.__init__(self) 
     self.set_title("Example2") 

     # Hack the color 
     self.entry.override_color(
      Gtk.StateFlags.INSENSITIVE, 
      Gdk.RGBA(0,0,0,1) 
      ) 

     self.entry.override_background_color(
      Gtk.StateFlags.INSENSITIVE, 
      Gdk.RGBA(1,1,1,1) 
      ) 


if __name__ == "__main__": 

    # Example 1 
    Window1 = Example() 
    Window1.connect("delete-event", Gtk.main_quit) 
    Window1.show_all() 

    # Example 2 
    Window2 = Example2() 
    Window2.show_all() 
    Gtk.main() 

我在這裏改寫例2的着色。我怎樣才能以一種總是與GTK主題相匹配的方式覆蓋它?

回答

1

您可以從它的GtkStyleContext訪問小部件的樣式屬性,您可以通過調用任何小部件的get_style_context方法來獲取小部件的樣式屬性。通過上下文的實例,您可以使用相應的GtkStateFlag訪問不同的樣式屬性。

這裏是如何得到控件的背景顏色,當它在NORMAL狀態的例子:

from gi.repository import Gtk 

def get_background_color(widget): 
    context = widget.get_style_context() 
    color = context.get_background_color(Gtk.StateFlags.NORMAL) 

    return color # the result is a GdkRGBA instance 

我不能完全肯定,你應該做的完全地覆蓋INSENSITIVE國家的風格是什麼,但我猜你應該使用GtkStyleProvider

+0

由於CSS沒有「背景顏色」,只有背景圖像,因此實際上不推薦使用GTK的新版本。 – ebassi

0

爲什麼不嘗試其他方法,如設置treeview.props.reorderable = False並將所有單元格渲染器模式設置爲INERT

相關問題