2014-11-24 15 views
1

我正在嘗試製作一個動態圖表,其中在用戶移動滑塊時更新修補程序。我正在使用隨anaconda python一起提供的matplotlib和pyqt包。我已經運行的代碼並正確執行了繪圖,但是當我移動滑塊時更新失敗。無法刪除並重繪或繪製基於PYQT小部件狀態更改的繪圖軸

我有以下

我的佈局與下面的類創建

class plotArea(QtGui.QWidget): 

def __init__(self): 
    super(plotArea, self).__init__() 
    self.init() 

def init(self): 
    grid = QtGui.QGridLayout() 
    self.setLayout(grid) 
    title = QtGui.QLabel('Title') 
    sldTime = QtGui.QSlider(QtCore.Qt.Horizontal) 
    sldLevel = QtGui.QSlider(QtCore.Qt.Vertical) 
    plot = MyDynamicMplCanvas() 
    sldTime.valueChanged[int].connect(plot.changeValue) 
    sldLevel.valueChanged[int].connect(plot.changeValue) 
    grid.addWidget(title, 0, 0, 1, 10) 
    grid.addWidget(sldLevel, 1, 0, 10, 1) 
    grid.addWidget(sldTime, 11, 1, 1, 9) 
    grid.addWidget(plot, 1, 1, 9, 9) 

我的圖表類與繪圖和更新方法示於下面

class MyDynamicMplCanvas(FigureCanvas): 

"""A canvas that updates itself every second with a new plot.""" 
def __init__(self): 
    fig = Figure() 
    FigureCanvas.__init__(self, fig) 
    chart = fig.add_subplot(111) 
    chart.set_xlim([0, 4]) 
    chart.set_ylim([0, 4]) 
    self.draw_lattice(chart) 

def draw_lattice(self, chart): 

    min_val = 0 
    max_val = 100 
    my_cmap = cm.get_cmap('jet') 
    norm = matplotlib.colors.Normalize(min_val, max_val) 
    color_i = my_cmap(norm(np.random.uniform(0, 100))) 
    my_cmap = cm.get_cmap('jet') 
    square = Rectangle((1, 1), 1, 1, alpha=0.5, facecolor=color_i, 
    edgecolor='k') 
    chart.add_patch(square) 

    def changeValue(self,chart): 
     self.draw_lattice(chart) 

由於這兩種方法都在同一個類中,不應該有任何範圍問題,並且代碼在初始傳遞時工作,但如果我移動滑塊,則會出現以下錯誤。

chart.add_patch(square) 

AttributeError的:「詮釋」對象有沒有屬性「add_patch」

我一直在努力與這個了一點什麼我做錯了什麼?我需要刪除該子圖嗎?我不知道爲什麼從changeValue調用導致代碼失敗。任何幫助深表感謝。

回答

1

即使您在init方法中定義了圖表,您實際上並未保留對其的引用。要真正保持它,你需要把線

chart = fig.add_subplot(111) 

self.chart = fig.add_subplot(111) 

然後使用self.chart引用它。

你傳遞一個整數插入插槽時,產生的信號時,這將是chart的說法,這就是爲什麼你會得到int錯誤 - chart被視爲在代碼中的軸對象,但任何事件都會把一個整數到該變量中。我會改變您的插槽的輸入爲slidervalue,並且只需參考self.chart來更新您的圖。

+0

感謝您的迴應,我需要使用格式self.variable_name所有實例? – TheCodeNovice 2014-11-24 17:43:42

+0

對於任何你需要保留引用的東西,是的 - 它成爲了你可以在所有方法中從self訪問的類的一個屬性 - self總是第一個參數。 – Ajean 2014-11-24 17:48:52