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



我有两个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将数据保存到一个文件中(可能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/!味精/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')
    

相关内容

  • 没有找到相关文章

最新更新