2011-04-29 33 views
7

我正在編寫一個使用Matplotlib進行圖形繪製的PyGTK/Twisted應用程序。使用FigureCanvasGtkAgg嵌入我的小部件很容易,但我注意到畫布的背景顏色(繪圖區域本身之外)與我的應用程序的其餘部分不匹配,並且字體也沒有(對於標籤,傳說等)。獲取Matplotlib的GTK Agg後端以尊重用戶主題

有沒有簡單的方法讓我的圖表尊重用戶選擇的GTK主題?

+0

我非常想看看你的代碼,因爲我試圖將pyplots放在我的小部件中,或者更確切地說,只是在GUI中使用圖形 – heltonbiker 2011-07-12 21:16:31

+0

@heltonbiker - 你會必須等待幾天,但是當我再次訪問代碼時,我會發布樣本。 – detly 2011-07-12 21:55:16

回答

3

您可以通過設置它,例如pylab.figure(facecolor=SOME_COLOR, ...)matplotlib.rcParams['figure.facecolor'] = SOME_COLOR。它看起來像它的默認值是hard-coded,所以無法告訴MPL尊重GTK主題。


下面是如何做到這一點在PyGTK的一個具體的例子。這裏的一些信息是從"Get colors of current gtk style"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_panelgtk.Alignment 和被的FigureCanvasGTKAgg一個子類,其具有根據需要figure構件。)

+3

太棒了!這讓我開始了,因此我添加了一些代碼,說明我如何在繪圖時實現將包含小部件的GTK主題更改爲背景。唯一的問題是,如果用戶在繪製圖形後更改主題,則圖形不會更改顏色。我認爲這是一個足以忽略的邊緣情況。 – detly 2012-02-09 01:39:19

+0

太棒了! Thnaks後續。 – tkf 2012-02-09 11:18:03