2016-01-21 22 views
0

我想將我的QMainWindow中的QPushButton與我使用Matplotlib創建的類連接,以便在按下按鈕時顯示網格。這是代碼的一部分:使用按鈕在不同類之間的matplotlib圖中添加網格

class Ventana(QMainWindow): 
    def __init__(self): 
    super(QMainWindow, self).__init__() 
    self.channel = ViewWidget() 

    #I add a toolbar and i put the button in here 
    self.toolbar2.addWidget(self.btn_showgrid) 
    self.btn_showgrid.setEnabled(True) 
    self.connect(self.btn_showgrid, SIGNAL("clicked()"), self.showGrid) 

    def showGrid(self): 
    self.btn_showgrid.setEnabled(False) 
    self.channel.axes.grid(True) 

class ViewWidget(QMainWindow): 
    def __init__(self): 
    QMainWindow.__init__(self) 
    self.mainWidget = QWidget() 
    self.setCentralWidget(self.mainWidget) 

    layout = QVBoxLayout() 
    self.mainWidget.setLayout(layout) 
    self.figure_canvas = FigureCanvas(Figure()) 
    layout.addWidget(self.figure_canvas, 10) 
    self.axes = self.figure_canvas.figure.add_subplot(111) 
    x = np.arange(0,5,0.1) 
    y = np.sin(x) 

    self.axes.plot(x,y) 

我的方法稱爲showGrid按鈕設置爲「禁用」(就是我要當按鈕被推向),但它不顯示網格。我究竟做錯了什麼?

希望你能幫助我。謝謝你的回答

-------------------------編輯---------------- ----------------

我做了一些改動。我創建了QPushButton,並將其添加到圖的工具欄中。

# create a simple widget to extend the navigation toolbar 

    self.btn_showgrid = QPushButton("Show Grid") 
    self.btn_showgrid.setEnabled(True) 
    self.btn_hidegrid = QPushButton("Hide Grid") 
    self.btn_hidegrid.setEnabled(False) 

    layout = QVBoxLayout() 
    self.mainWidget.setLayout(layout) 
    self.figure_canvas = FigureCanvas(Figure()) 
    layout.addWidget(self.figure_canvas, 10) 

    self.axes = self.figure_canvas.figure.add_subplot(111) 
    self.axes.grid(False) 

    x = np.arange(0,5,0.1) 
    y = np.sin(x) 

    self.axes.plot(x,y) 

我也放了一行:self.axes.grid(False),你可以在上面看到。而在最後我創造了這個方法:

def showGrid(self): 
    self.btn_showgrid.setEnabled(False) 
    self.btn_hidegrid.setEnabled(True) 
    self.axes.grid(True) 
    self.axes.draw()  

現在的問題是,當我按下按鈕,隱藏的僅僅是像它應該,但網格確實沒有任何顯示。但是,如果在同一個`QMainWindow中創建一個新的情節,它的工作原理!

我想我需要刷新陰謀,此刻我使self.axes.grid(True),但draw()不起作用。我怎樣才能做到這一點?我的意思是,刷新情節?

+0

您是否需要設置您的FigureCanvas的父級? 'self.figure_canvas.setParent(self.mainWidget)' – Suever

+0

我試過了,但沒有顯示任何改變。 –

+0

謝謝你的回答@Suever :) –

回答

0

您需要告訴畫布重新繪製。圖可以是昂貴的,所以更新藝術家的狀態不會觸發重新繪製(pyplot API 確實這樣做,但你不應該在這裏使用)。我認爲

def showGrid(self): 
    self.btn_showgrid.setEnabled(False) 
    self.channel.axes.grid(True) 
    self.channel.canvas.draw_idle() 

將做的伎倆。對draw_idle的電話告訴Qt,下一次它重畫到的窗口也觸發mpl的Agg重繪,並請安排重新繪製'很快'。

+0

謝謝你的回答@tcaswell。看看我如何編輯它。我使用draw()調用,但它不刷新劇情。有另外一種方法可以做到這一點嗎? –

+0

您需要調用畫布上的繪圖,而不是軸上的繪圖。另外,你應該使用'draw_idle',因爲它更適合Qt事件循環。 – tacaswell

+0

非常感謝你! 。那是我的錯誤。我用'self.figure_canvas.draw_idle()'替換'self.axes.draw()'。感謝您的回答和您的幫助。 –

相關問題