2014-05-01 64 views
3

我有一個matplotlib圖形(一個FigureCanvasWxAgg對象),我想將WX Button置於HTML/CSS條目的畫布上,該按鈕應具有較高的z索引。這種初始化將子窗口保持在其父窗口的視覺上

button = wx.Button(canvas, label='Some Button') 
button.Raise() 

在圖表重繪自己,直到圖表重新繪製自己,此時按鈕消失的技巧。我仍然可以點擊這個按鈕,並調整窗口大小(調整畫布大小)使按鈕再次可見。傳統的方法是確保子窗口始終高於其父級?

回答

0

backend file backend_wx.py中,您可以看到matplotlib直接繪製到窗口上以及之前創建的按鈕上。你所要做的是一個觸發重繪該按鈕後,提請圖形來代替draw方法:

fig = figure() 
but = Button(fig.canvas, label="button") 
original_draw = fig.canvas.draw 
def draw(gc=None): 
    original_draw(gc) 
    but.SetLabel(but.GetLabel()) 
fig.canvas.draw = draw 
plot([1],[1]) 

我用but.SetLabel(but.GetLabel())迫使按鈕的重繪。使用wx.PostEvent發送適當的繪畫事件也應該如此。如果您有多個控件並且不想畫出所有控件,因爲調整大小可以解決問題,您可以使用SendSizeEvent()來觸發重繪。您必須添加一些機制來防止無限循環,因爲大小事件處理程序再次調用draw

最好的解決方案可能是寫一個自己的matplotlib的後端,一個不拉進主窗口,但到畫布的孩子,這樣的GUI工具包可以處理繪製順序。但這也是最涉及的解決方案。文檔中包含有關該主題的一些信息,您可能也會發現已經提到的backend_wx.py有幫助。順便說一下:如果按鈕不需要放在畫布上,也可以通過gcf().canvas.toolbar將它添加到工具欄中。