很抱歉,如果这是转贴,我无法在任何地方找到答案。我正在使用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主题匹配的方式覆盖它?
答案 0 :(得分: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。
答案 1 :(得分:0)
为什么不尝试其他方法,例如设置treeview.props.reorderable = False
并将所有单元格渲染器模式设置为INERT
?