Как заставить бэкэнд GTK Agg Matplotlib уважать пользовательские темы

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

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


person detly    schedule 29.04.2011    source источник
comment
Я очень хотел бы взглянуть на ваш код, так как я тоже пытаюсь поместить pyplots в свои виджеты, или, точнее, иметь только фигуру для использования внутри графического интерфейса.   -  person heltonbiker    schedule 13.07.2011
comment
@heltonbiker - вам придется подождать несколько дней, но я опубликую образец, когда снова получу доступ к коду.   -  person detly    schedule 13.07.2011


Ответы (1)


Вы можете установить его, например, pylab.figure(facecolor=SOME_COLOR, ...) или matplotlib.rcParams['figure.facecolor'] = SOME_COLOR. Похоже, что его значение по умолчанию равно hard-coded, поэтому нет никакого способа заставить 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.)

person tkf    schedule 08.02.2012
comment
Здорово! Это заставило меня начать, поэтому я добавил некоторый код, иллюстрирующий, как я реализовал изменение фона на тему GTK содержащего виджета во время рисования. Единственная проблема заключается в том, что если пользователь изменит тему после того, как график будет нарисован, график не изменит цвет. Я думаю, что это достаточно маленький пограничный случай, чтобы его игнорировать. - person detly; 09.02.2012
comment
Здорово! Спасибо за продолжение. - person tkf; 09.02.2012