Hi Patrick, Thank you for the explanation. I will read through the thread you linked to. I have been using pyqtgraph for various things for a couple of years--it is probably time I learn about the Qt event loop. If I were to make my script into a class and instance the class after 'if __name__ == '__main__': would the plotting have worked as expected since the timer would start prior to solve the DE?
Cheers, Mike On Sunday, March 31, 2019 at 6:30:37 PM UTC-6, Patrick wrote: > > 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/be72ef84-95f4-40b4-a6fa-2b98ebfcfd1d%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
