In GTK 3, people can set their own themes. Even the default theme (Adwaita) is provided with two variants: a light one and a dark one. As I am writing my own w
You don't need to instantiate GTK widgets to retrieve their StyleContext
.
You can create an empty Gtk.StyleContext and set the Gtk.WidgetPath of a widget class.
The foreground color can be retrieved with .get_color(). Other colors and style properties can be retrieved with .get_property().
Both methods need Gtk.StateFlags.
For properties, see GTK+ CSS Overview and GTK+ 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) )
In your widget's do_draw()
implementation, you can read out the theme colors from the widget's style context. For this you use methods such as self.get_style_context().get_color()
, ...get_border_color()
, ...get_background_color()
.