在Python中整合两个事件处理程序
我有两个Python程序,分别叫做Prog1.py和Prog2.py。Prog1的作用是从一个外部设备获取实时数据。现在,它会在获取到数据时把数据打印到屏幕上。程序里有一个循环,每次循环都会打印出新获取的数据。Prog2是一个用PyQtGraph写的程序,目的是像监视器一样实时绘制数据。目前,Prog2的功能是(当它单独运行时)绘制已经获取的数据。这是一个动态的图表。Prog2.py里有一个更新函数,这个函数会被一个定时器在指定的时间间隔内反复调用,以便用下一个数据点更新图表(让图表向右移动)。我的目标是把Prog1和Prog2连接起来,也就是说,我想把Prog1实时获取的数据传输给Prog2,这样Prog2就可以实时绘制数据。
因为Prog1和Prog2是独立的事件,各自有自己的事件循环,所以我不太确定怎么把它们连接起来。我想到一个简单的办法,就是让Prog1.py和Prog2.py并行运行,让Prog1.py把数据保存到一个文件里(也许用pickle?),然后让Prog2.py从这个文件读取数据并绘制图表。但我对此并不太满意,这样看起来不太干净。我想要的是在Prog1.py里直接运行整个Prog2.py的代码。有没有什么更好的方法呢?
编辑-代码
Prog1.py
/*
Code to get data from USB
*/
def main():
while 1:
data = get_data()
print data
main()
Prog2.py是通过定时器更新图表并使其滚动的PyQtGraph代码
1 个回答
你有几个选择,可能每个都能解决问题:
- 把程序合并成一个,创建一个工作线程来监控数据,并把这些数据发送回主线程进行绘图。(参考:https://groups.google.com/forum/#!msg/pyqtgraph/haiJsGhxTaQ/RkOov_UZEcYJ)
把程序合并成一个单线程的程序,使用一个定时器来检查新数据,每当有新数据到达时就重新绘图:
plt = pg.plot() def update(): data = getNewData() if data is not None: plt.plot(data, clear=True) timer = QTimer() timer.timeout.connect(update) timer.start(10)
保持程序分开,使用某种形式的进程间通信(IPC)——比如套接字、管道等,来让它们之间互相交流。这需要对数据进行序列化(你提到的可能使用pickle)。
pyqtgraph.multiprocess
甚至可以让你在不同进程之间发送Qt信号。这可能是最难的选择,但这里有一个简单的例子:import pyqtgraph as pg import pyqtgraph.multiprocess as mp proc = mp.QtProcess() # start second process for plotting rpg = proc._import('pyqtgraph') plt = rpg.plot() # create a PlotWidget in remote process # Unlike the last example, we can use a wile-loop here because the Qt # event loop is running in another process. while True: data = getNewData() if data is not None: plt.plot(data, clear=True, _callSync='off')