Настройване на бекенда на GTK Agg на Matplotlib, за да зачита темата на потребителите

Пиша приложение PyGTK/Twisted, което използва Matplotlib за графики. Достатъчно лесно е да вградя графиките в моите джаджи с помощта на FigureCanvasGtkAgg, но забелязвам, че цветът на фона на платното (извън самата област на графика) не съвпада с този за останалата част от приложението ми, както и шрифтът (за етикети , легенди и др.).

Има ли лесен начин да накарам моите графики да спазват избраната от потребителя GTK тема?


person detly    schedule 29.04.2011    source източник
comment
Много бих искал да разгледам вашия код, тъй като се опитвам да поставя pyplots и в моите джаджи, или по-точно, да имам само фигурата, която да използвам в GUI   -  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. Изглежда, че стойността му по подразбиране е твърдо кодирана, така че няма начин да кажете на 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