如何在 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 并没有那么糟糕,但我仍然更喜欢只调用一个方法。
我有 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 并没有那么糟糕,但我仍然更喜欢只调用一个方法。