Обновление пошагового графика в Wx Python в режиме реального времени - PullRequest
0 голосов
/ 13 февраля 2020

Я пишу GUI, чтобы получить информацию по очереди, а затем построить пошаговый график с полученной информацией по мере поступления. Контейнеры заполняются информацией, но мой график не обновляется. Вот фрагмент кода, который я использую.

class bottomRight(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        # INITIALIZE RIGHT PANEL PLOT
        self.counts = np.zeros(240) #240 bins
        #self.energyBins = np.linspace(0,15000,240) #expecting max energy of 1.8 MeV
        self.energyBins = np.linspace(0,1.8,240)
        self.initSpectrum()
    def initSpectrum(self):
        plt.ion()
        self.figureMAW = Figure()
        self.axes = self.figureMAW.add_subplot(111)#.gca()
        self.canvas = FigureCanvas(self, -1, self.figureMAW)
        self.figureMAW.set_size_inches(8, 5)
        self.sizerMAW = wx.BoxSizer(wx.HORIZONTAL)
        self.sizerMAW.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizerMAW)
        self.plotMAWData = self.axes.step(
            self.energyBins, self.counts)[0]
        self.axes.set_xlabel('ADC Value')
        self.axes.set_ylabel('Counts')
    def plotADC(self,adc):
        '''
        Window shouldn't clear everytime this function is called.
        It should just add counts to the counts array.
        Testing this feature with a try-except statement.
        '''
        for z in range(len(adc)):
            try:
                bins = 15000/240#1.8/240
                self.counts[int(((adc[z])//bins))] += 1 #7.5 keV bins
            except:
                break

            self.axes.cla()
            print('counts = ', self.counts)
            self.plotADCData = self.axes.step(
                    self.energyBins, self.counts)

            self.canvas.draw()
class GUI(wx.Frame):
    def __init__(self):
        self.main = wx.Frame#.__init__(self, None, wx.ID_ANY, "GUI", size=(1200,650))
        self.main.__init__(self, None, wx.ID_ANY, "GUI", size=(1200,650))
        # DEFINE A SPLIT WINDOW FOR PLOTTING
        self.splitWin = wx.SplitterWindow(self)
        topP = topPanel(self)
        self.lp = bottomLeft(self.splitWin)
        self.rp = bottomRight(self.splitWin)
    def onAcquire(self,e):
        while True:
                message = receive_queue_data()
                #print(message)
                if message is not None:
                    print(message['data']['gate2'])
                    adc = np.array(message['data']['gate2'])
                    #print('adc = ', adc)
                    self.rp.plotADC(adc)
if __name__ == "__main__":
    app = wx.App(False)
    frame = GUI()
    frame.Show()
    app.MainLoop()
    frame.Refresh()

Почему в моем While l oop не вызывается обновление графика каждый раз, когда self.rp.plotADC(adc) вызывается? Спасибо!

...