在Python中整合两个事件处理程序

0 投票
1 回答
609 浏览
提问于 2025-04-18 10:32

我有两个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 个回答

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

撰写回答