在Python中集成两个事件处理程序

2024-04-26 13:14:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个Python程序。我们称它们为Prog1.py和Prog2.py。Prog1正在帮助我从外部设备获取实时数据。到目前为止,当它获得数据时,它会在屏幕上打印出来。有一个while循环正在运行,在每次迭代中它都打印出所获取的新数据集。现在Prog2是一个使用PyQtGraph构建的Python程序,其目的是像监视器一样实时地绘制数据。到目前为止,Prog2所做的是(也就是说,当它单独运行时),它会绘制已经获得的数据。这是一个动人的情节。所以Prog2.py有一个update函数,这个函数由计时器以指定的时间间隔重复调用,以便用下一个数据点更新图形(使其向右移动)。我的目标是将Prog1和Prog2连接起来,也就是说,我希望通过管道将Prog1实时获取的数据传输到Prog2,以便Prog2能够实时地绘制数据。

因为Prog1和Prog2是独立的事件,有它们自己的事件循环过程,所以我不确定如何将它们链接起来。我认为一个天真的想法是并行运行Prog1.py和Prog2.py,并要求Prog1.py将数据保存到一个文件中(可能会对其进行pickle?)然后让Prog2.py从中读取,然后绘制图表。但我不相信这一点。这看起来很脏。我想在Prog1.py中运行整个Prog2.py代码。有没有一个干净的方法来做这个?

编辑- 代码

程序1.py

/*

Code to get data from USB

*/

def main():
    while 1:
        data = get_data()
        print data

main()

py是PyQtGraph代码,通过totimer更新图形并使其滚动


Tags: 数据函数代码py程序图形dataget
1条回答
网友
1楼 · 发布于 2024-04-26 13:14:56

你有几个选择,可能其中任何一个都有效:

  1. 将这些程序合并为一个,工作线程监视数据并将其发送回主线程进行绘图。(参见:https://groups.google.com/forum/#!msg/pyqtgraph/haiJsGhxTaQ/RkOov_UZEcYJ
  2. 将这些程序连接到一个单线程程序中,使用计时器检查新数据,并在数据到达时回复:

    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)
    
  3. 将程序分开,并使用某种形式的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')
    

相关问题 更多 >