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

时间:2016-08-10 10:56:47

标签: python python-3.x gtk gtk3 pygobject

上下文

在GTK 3中,人们可以设置自己的主题。甚至默认主题(Adwaita)也提供两种变体:浅色和暗色。当我正在编写我自己的小部件(在python中)时,我需要获得这些颜色,以避免在黑色或白色上画黑色。

问题

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

工作

的事情
  • GtkSettings 过去提供了一个可接受的gtk-theme-color属性,但它不再存在,并且文档中没有引用来解释如何替换它。
  • 我不想从另一个小部件中获取该颜色:
    • This没有用:PyGTK不适用于Python / GTK 3,而且需要另外一个小部件。
    • This会更好(PyGObject - 至少基于)但是再次,thar会要求我从另一个小部件复制样式。

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

因为原始的颜色在某处。原则上,我没有看到为什么我应该被迫间接访问它。

此外,如果因为你敢在某处删除单个标签而导致程序崩溃,你会如何反应?如果改变单个标签的颜色实际上改变了其他完全不相关的小部件的颜色,你会如何反应?

我不想要这种惊喜。

2 个答案:

答案 0 :(得分:1)

您无需实例化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) )

答案 1 :(得分:0)

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