2

抱歉,如果这是转发,我只是无法在任何地方找到答案。我正在用 Python 和 GTK+3 开发一个应用程序,它的 TreeView 设置为 INSENSITIVE。这禁止我们的用户在常量表上进行直接选择。然而,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 主题的方式覆盖它?

4

2 回答 2

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

于 2013-01-07T23:48:48.253 回答
0

您为什么不尝试另一种方法,例如treeview.props.reorderable = False将所有单元格渲染器模式设置为INERT?

于 2013-01-08T09:28:04.007 回答