如何在GTK中获得默认颜色?

2024-05-16 04:41:09 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文

在gtk3中,人们可以设置自己的主题。即使是默认的主题(Adwaita)也提供了两个变体:浅色和深色。在我编写自己的widget(用python编写)时,我需要获得这些颜色,以避免在黑底黑或白底白字上绘制。在

问题

如何访问用户GTK主题的默认颜色?在


不起作用的东西

  • GtkSettings用于提供可接受的gtk-theme-color属性,但它已经不存在了,并且文档中没有引用来解释如何替换它。在
  • 我不想从另一个小工具中获得这种颜色:
    • This没有用处:PyGTK不能与Python/gtk3一起工作,这需要另一个小部件。在
    • This会更好(至少是基于PyGObject)但是同样,thar需要我从另一个小部件复制样式。在

为什么我不想从另一个小部件复制样式?在

因为原始的颜色在某处。原则上,我不明白为什么我应该被迫间接地访问它。在

此外,如果你仅仅因为胆敢删除某个地方的某个标签而使程序崩溃,你会有什么反应?如果改变一个标签的颜色实际上改变了其他完全无关的小部件的颜色,你会有什么反应?在

我不想要这种惊喜。在


Tags: 主题颜色部件绘制样式标签变体widget
2条回答

在小部件的do_draw()实现中,可以从小部件的样式上下文中读取主题颜色。为此,可以使用诸如self.get_style_context().get_color()...get_border_color()...get_background_color()等方法。在

您不需要实例化GTK小部件来检索它们的StyleContext。在

您可以创建一个空的Gtk.StyleContext并设置小部件类的Gtk.WidgetPath。在

前景色可以用.get_color()检索。 其他颜色和样式属性可以用.get_property()检索。在

两个方法都需要Gtk.StateFlags。在

有关属性,请参见GTK+ CSS OverviewGTK+ CSS Properties。在

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

# Create an empty style context
style_ctx = Gtk.StyleContext();

# Create an empty widget path
widget_path =  Gtk.WidgetPath();

# Specify the widget class type you want to get colors from
widget_path.append_type(Gtk.Button);
style_ctx.set_path(widget_path);

# Print style context colors of widget class Gtk.Button
print('Gtk.Button: Normal:')
print('foreground color: ', style_ctx.get_color(Gtk.StateFlags.NORMAL) )
print('color:            ', style_ctx.get_property('color', Gtk.StateFlags.NORMAL) )
print('background color: ', style_ctx.get_property('background-color', Gtk.StateFlags.NORMAL) )
print('outline color:    ', style_ctx.get_property('outline-color', Gtk.StateFlags.NORMAL) )

print('Gtk.Button: Link:')
print('foreground color: ', style_ctx.get_color(Gtk.StateFlags.LINK) )
print('color:            ', style_ctx.get_property('color', Gtk.StateFlags.LINK) )
print('background color: ', style_ctx.get_property('background-color', Gtk.StateFlags.LINK) )
print('outline color:    ', style_ctx.get_property('outline-color', Gtk.StateFlags.LINK) )

相关问题 更多 >