Skip to main content
 首页 » 编程设计

python之GTK+3 : How to render INSENSITIVE widgets in the style of NORMAL widgets

2025年05月04日8lori

抱歉,如果这是转贴,我只是找不到任何地方的答案。我正在用 Python 和 GTK+3 开发一个应用程序,它有一个设置为 INSENSITIVE 的 TreeView。这禁止我们的用户在常量表上进行直接选择。然而,INSENSITIVE GTK+3 小部件的默认行为是遮蔽一个不敏感的对象。在大多数情况下,这是一个很好的行为,但就我而言,我需要我的表格保持清晰易读。

我想做的是能够覆盖此特定 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() 

这里我改写了Example2的着色。如何以始终匹配 GTK 主题的方式覆盖它?

请您参考如下方法:

您可以从它的 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 .