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

时间:2014-06-20 16:53:53

标签: python qt events event-handling pyqtgraph

我有两个Python程序。我们称它们为Prog1.py和Prog2.py。 Prog1帮助我从外部设备获取实时数据。截至目前,当它获取数据时,它将其打印在屏幕上。有一个while循环运行,在每次迭代中它打印出所获取的新数据集。现在,Prog2是一个使用PyQtGraph构建的Python程序,用于实时绘制与监视器相同的数据。截至目前,Prog2所做的是(即,当它单独运行时),它绘制已经获取的数据。这是一个动人的情节。所以Prog2.py有一个更新函数,它由指定的时间间隔重复调用,以便用下一个数据点更新图形(使其向右移动)。我的目标是链接Prog1和Prog2 - 我想以某种方式将Prog1实时获取的数据传输到Prog2,以便Prog2可以实时绘制数据。

由于Prog1和Prog2是具有自己的事件循环过程的独立事件,因此我不确定如何链接它们。我想到的一个天真的想法就是并行运行Prog1.py和Prog2.py并要求Prog1.py将数据保存到文件中(也许可以腌制它?)并要求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 个答案:

答案 0 :(得分:1)

您可以选择其中任何一种方法:

  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')