Hi,

I thought an explanation of why your original code didn't work might be 
helpful. Since pyqtgraph is based off Qt, then understanding the Qt event 
loop is important - all of the GUI updates must be done from within the Qt 
event loop. Data acquisition or processing can be done on separate threads, 
but should be communicated back to the GUI through Qt signal/slot style 
methods.

In your code, your program starts up and does the DE solving code 
immediately. Interestingly, your timer.start() call doesn't actually start 
the timer yet! Your program then hits the __name__ == '__main__' part, 
where the .exec_() line starts the Qt event loop thread. This then begins 
triggering events, such as displaying the GUI and starting the timer calls. 
So by the time your GUI is drawn, the DE solving is done.

Jim's answer above is correct. If you're interested in doing this the 
alternative way, processing on a separate thread (and doing the 
signal/slots thing), then the code from this answer might help explain how 
to do that: 
https://groups.google.com/forum/#!msg/pyqtgraph/ajykxBvysEc/e1V8lvZSCgAJ

Patrick


On Sunday, 31 March 2019 06:29:45 UTC+10:30, Michael DeFeo wrote:
>
> Thank you very much for your reply. I was able to get it working by using 
> QTimers to call the functions that evaluate the ODE as you suggested.
>
> Cheers,
> Mike
>
> On Thursday, March 28, 2019 at 11:48:03 AM UTC-6, Michael DeFeo wrote:
>>
>> I am trying to write a program that will solve a differential equation 
>> for several values of one of the equations parameters in a for loop. After 
>> each iteration of the loop I would like to plot the mean value of the 
>> solution. What happens in practice is the the plot will only be generated 
>> after exiting the for loop. A minimal working example demonstrating this 
>> issue is pasted below and attached. Any advice on how to get this working 
>> is appreciated. 
>>
>> Cheers!
>>
>>
>>
>> # gui
>> import pyqtgraph as pg
>> from pyqtgraph.Qt import QtCore, QtGui
>> import numpy as np
>>
>> # ODE
>> from scipy.integrate import RK45
>>
>> win = pg.GraphicsWindow()
>> p1 = win.addPlot()
>> data = np.empty([100000,2])     # Holds time dep. solution
>>
>> g = 0.5
>> cntr = 0
>>
>> def EOM(t,y):
>>     global g
>>     return -g*y
>>
>> def update():
>>     p1.plot(tcData[:cntr,:])
>>
>> timer = QtCore.QTimer()
>> timer.timeout.connect(update)
>> timer.start(0)
>>
>> tC = np.linspace(-0.5,0.5,20)   # Sweep parameter
>> tcData = np.empty([len(tC),2])  # Holds mean solution (plot this data)
>> for idx,item in enumerate(tC):
>>     ode = RK45(EOM, 0, [5],t_bound=10,max_step=0.001)
>>     cntr = 0
>>     g = item
>>     while ode.status == 'running':
>>         ode.step()
>>         data[cntr,0] = ode.t
>>         data[cntr,1] = ode.y
>>         cntr+=1
>>     tcData[idx,0] = item
>>     tcData[idx,1] = np.mean(data[:,1])
>>     print( idx )
>>
>>
>> if __name__ == '__main__':
>>     import sys
>>     if (sys.flags.interactive != 1) or not hasattr(QtCore, 
>> 'PYQT_VERSION'):
>>         QtGui.QApplication.instance().exec_()
>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"pyqtgraph" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pyqtgraph/47b2195b-d0a8-48b4-a2a6-dc4ccbccbd0b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to