Получение бэкэнда GTK Agg от Matplotlib для соблюдения темы пользователя - PullRequest
7 голосов
/ 29 апреля 2011

Я пишу приложение PyGTK / Twisted, которое использует Matplotlib для построения графиков. Достаточно просто внедрить графики в мои виджеты с помощью FigureCanvasGtkAgg, но я замечаю, что цвет фона холста (вне самой области графика) не совпадает с цветом для остальной части моего приложения, а также шрифт (для меток , легенды и т. д.).

Есть ли простой способ заставить мои графики соответствовать выбранной пользователем теме GTK?

1 Ответ

3 голосов
/ 08 февраля 2012

Вы можете установить его, например, pylab.figure(facecolor=SOME_COLOR, ...) или matplotlib.rcParams['figure.facecolor'] = SOME_COLOR.Похоже, что его значение по умолчанию жестко закодировано , поэтому нет способа заставить MPL уважать тему GTK.


Вот конкретный пример того, как это сделать вPyGTK.Часть этой информации была взята из "Получить цвета текущего стиля gtk" и из gdk.Color документов.Я не дошел до установки шрифта и т. Д., Но это показывает базовую структуру, которая вам нужна.

Сначала определите следующую функцию:

def set_graph_appearance(container, figure):
    """
    Given a GTK container and a Matplotlib "figure" object, this will set the
    figure background colour to be the same as the normal colour of the
    container.
    """
    # "bg" is the background "style helper" object. It contains five different
    # colours, for the five different widget states.
    bg_style = container.get_style().bg[gtk.STATE_NORMAL]
    gtk_color = (bg_style.red_float, bg_style.green_float, bg_style.blue_float)
    figure.set_facecolor(gtk_color)

Затем вы можете подключиться ксигнал realize (может быть, также сигнал map-event, я не пробовал) и перекрасить график при создании содержащего виджета:

graph_panel.connect('realize', set_graph_appearance, graph.figure)

(Здесь graph_panel - этоgtk.Alignment и graph - это подкласс FigureCanvasGTKAgg, который имеет figure член по необходимости.)

...