如何在 PyGObject 3.38 中设置小部件颜色的子集?

How to set a subset of widgets' colors in PyGObject 3.38?

我有 4 个 PyGObject 应用程序,我正在从较旧的 PyGObject 版本更新到 PyGObject 3.38。

其中三个申请非常顺利。第四,hcm(https://stromberg.dnsalias.org/~strombrg/hcm/)比较麻烦。该应用程序可以运行,但我收到了 DeprecationWarning,我想消除它。

警告看起来像:

$ ./hcm.py --gui
./hcm.py:1035: DeprecationWarning: Gtk.Widget.modify_fg is deprecated
  gui_stuff.modify_fg(Gtk.StateType.NORMAL, Gdk.color_parse(color))

发出该警告的代码目前如下所示:

def color_traversal(gui_stuff, color):                                                                              
    """Traverse a widget hierarchy, changing colors as we go."""             
    # I'm thinking the stack requirements won't actually be that hefty, at least as
    # long as we're talking about a hierarchy and not a proper graph ^_^                     
    if hasattr(gui_stuff, 'get_children'):
        for child in gui_stuff.get_children():
            color_traversal(child, color)                                               
    if hasattr(gui_stuff, 'modify_fg'):                            
        # modify_fg is deprecated              
        gui_stuff.modify_fg(Gtk.StateType.NORMAL, Gdk.color_parse(color))
    # if hasattr(gui_stuff, 'override_color'):
        # override_color is deprecated too             
        # rgba = Gdk.RGBA()                              
        # rgba.parse(color)                                        
        # gui_stuff.override_color(Gtk.StateType.NORMAL, rgba)
    # if hasattr(gui_stuff, 'set_rgba'):     
        # This doesn't appear to work; none of the widgets I'm traversing have a set_rgba method
        # gdk_color = Gdk.color_parse(color)
        # rgba = Gdk.RGBA(gdk_color.red, gdk_color.green, gdk_color.blue, 1.0)
        # gui_stuff.set_rgba(rgba)
    # Maybe try get_style_context() ?
    # Maybe try CSS: https://shallowsky.com/blog/programming/styling-gtk3-with-css-python.html

"gui_stuff" 只是一个框或按钮或其他东西。 color_traversal 函数只是递归地遍历小部件及其组件小部件,将它们的前景色更改为调用者指定的颜色。

我有很多 Python 经验,但几乎没有 CSS 经验。 CSS 现在是做这种事情的唯一方法吗?我必须说,与函数调用相比,学习一门新语言来设置一些小部件的颜色似乎有点难。

这是我希望它看起来像的快速图片:

我已经搜索了几个小时如何执行此操作,但只找到了已弃用的函数或 CSS 方法的不完整描述。

谢谢!

我改为:

for color in (b'darkblue', b'darkgreen', b'darkred'):
    provider = Gtk.CssProvider()                                      
    style_context = Gtk.StyleContext()
    style_context.add_provider_for_screen(       
        screen, provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
    )                                          
    css = b'#%s { color: %s; }' % (color, color)                                
    provider.load_from_data(css)        

并加了一堆widget.set_name('darkgreen'),例如:

self.stayopen_button.set_name(self.across_color)

...其中 self.across_color 就像 'darkgreen'.

它正在运行。我想 CSS 并没有那么糟糕,但我仍然更喜欢只调用一个方法。