Python 3.x pyqtgraph动态绘图:将行添加到打开的GUI

Python 3.x pyqtgraph动态绘图:将行添加到打开的GUI,python-3.x,user-interface,plot,pyqtgraph,Python 3.x,User Interface,Plot,Pyqtgraph,我正在尝试将新线添加到现有的开放式绘图中 我写了一个看门狗,用测量数据监视一个文件夹。每隔几秒钟就会有一个新的数据文件。我尝试生成的应用程序应该在看门狗触发时读取文件,并将数据添加到绘图中 在更新现有数据时,使用QTimer之类的工具进行动态绘图是很容易的,但我没有为新线设置挂钩 另外,当我想在_exec()上进行绘图时运行脚本,是否必须使用多线程 这就是我试过的。当目录中有新数据可用时,看门狗应调用更新函数 import time as time from watchdog.observers

我正在尝试将新线添加到现有的开放式绘图中

我写了一个看门狗,用测量数据监视一个文件夹。每隔几秒钟就会有一个新的数据文件。我尝试生成的应用程序应该在看门狗触发时读取文件,并将数据添加到绘图中

在更新现有数据时,使用QTimer之类的工具进行动态绘图是很容易的,但我没有为新线设置挂钩

另外,当我想在_exec()上进行绘图时运行脚本,是否必须使用多线程

这就是我试过的。当目录中有新数据可用时,看门狗应调用更新函数

import time as time
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler

if __name__ == "__main__":
    patterns = "*"
    ignore_patterns = ""
    ignore_directories = False
    case_sensitive = True
    go_recursively = False
    my_event_handler = PatternMatchingEventHandler(patterns, ignore_patterns, ignore_directories, case_sensitive)

    def on_created(event):
        print(f" {event.src_path} has been created!") #this function should call the plot update

    my_event_handler.on_created = on_created
    path = (r'C:\Users\...') #path from GUI at some point

    my_observer = Observer()
    my_observer.schedule(my_event_handler, path, recursive=go_recursively)
    my_observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        my_observer.stop()
        my_observer.join()
exec_()方法正在阻塞,因此starter()也将被阻塞,并且在窗口关闭时将被解锁,这意味着starter之后的所有代码将仅在关闭窗口后执行。另一方面,您不应该在GUI线程中使用time.sleep,因为它会阻止GUI事件循环的执行

根据所使用的技术,提供了更新元素的方法,在Qt的情况下,适当的方法是使用信号,以便看门狗的所有逻辑将封装在QObject中,QObject将通过信号将信息传输到GUI,然后GUI将该信息绘制出来

导入系统 从watchdog.Observer导入观察者 从watchdog.events导入PatternMatchingEventHandler 从pyqtgraph.Qt导入QtGui,QtCore 将pyqtgraph作为pq导入 将numpy作为np导入 类QObserver(QtCore.QObject): dataChanged=QtCore.pyqtSignal(对象) def uuu init uuu(self,parent=None): 超级(QObserver,self)。\uuuu初始化\uuuu(父级) patterns=“*” 忽略_模式=“” 忽略目录=False 区分大小写=真 递归go_=False path=r“C:\Users\…”#某一点上GUI的路径 事件处理程序=模式匹配事件处理程序( 模式,忽略模式,忽略目录,区分大小写 ) event\u handler.on\u created=self.on\u created self.observer=observer() self.observer.schedule(事件处理程序,路径,递归=go\u递归) self.observer.start() 已创建def(自身、事件): 印刷品( f“{event.src_path}已创建!” )#此函数应调用绘图更新 self.dataChanged.emit(np.random.randint(1,5)) 类Plot2d(QtCore.QObject): def uuu init uuu(self,parent=None): super()。\uuuu init\uuuu(父级) self.traces=dict() self.num=0 pq.setConfigOptions(antialias=True) self.app=QtGui.QApplication(sys.argv) self.win=pq.GraphicsWindow(title=“示例”) self.win.resize(1000600) self.win.setWindowTitle(“Windowtitle”) self.canvas=self.win.addPlot(title=“Plot”) def启动器(自): 如果(sys.flags.interactive!=1)或不是hasattr(QtCore,“PYQT_版本”): QtGui.QApplication.instance() def跟踪(自身、名称、数据集_x、数据集_y): 如果名称在self.traces中: self.traces[name].setData(数据集_x,数据集_y) 其他: self.traces[name]=self.canvas.plot(pen=“y”) @QtCore.pyqtSlot(对象) def更新(自我,i): x_数据=np.arange(0,3.0,0.01) y_数据=x_数据*i 自我跟踪(str(i)、x_数据、y_数据) 自我跟踪(str(i)、x_数据、y_数据) 如果名称=“\uuuuu main\uuuuuuuu”: p=Plot2d() qobserver=qobserver() qobserver.dataChanged.connect(p.update) p、 起动器() exec_uz()方法正在阻塞,因此starter()也将被阻塞,并且在窗口关闭时将被解锁,这意味着starter之后的所有代码将仅在关闭窗口后执行。另一方面,您不应该在GUI线程中使用time.sleep,因为它会阻止GUI事件循环的执行

根据所使用的技术,提供了更新元素的方法,在Qt的情况下,适当的方法是使用信号,以便看门狗的所有逻辑将封装在QObject中,QObject将通过信号将信息传输到GUI,然后GUI将该信息绘制出来

导入系统 从watchdog.Observer导入观察者 从watchdog.events导入PatternMatchingEventHandler 从pyqtgraph.Qt导入QtGui,QtCore 将pyqtgraph作为pq导入 将numpy作为np导入 类QObserver(QtCore.QObject): dataChanged=QtCore.pyqtSignal(对象) def uuu init uuu(self,parent=None): 超级(QObserver,self)。\uuuu初始化\uuuu(父级) patterns=“*” 忽略_模式=“” 忽略目录=False 区分大小写=真 递归go_=False path=r“C:\Users\…”#某一点上GUI的路径 事件处理程序=模式匹配事件处理程序( 模式,忽略模式,忽略目录,区分大小写 ) event\u handler.on\u created=self.on\u created self.observer=observer() self.observer.schedule(事件处理程序,路径,递归=go\u递归) self.observer.start() 已创建def(自身、事件): 印刷品( f“{event.src_path}已创建!” )#此函数应调用绘图更新 self.dataChanged.emit(np.random.randint(1,5)) 类Plot2d(QtCore.QObject): def uuu init uuu(self,parent=None): super()。\uuuu init\uuuu(父级) self.traces=dict() self.num=0 pq.setConfigOptions(antialias=True) self.app=QtGui.QApplication(sys.argv) self.win=pq.GraphicsWindow(title=“示例”) self.win.resize(1000600) self.win.setWindowTitle(“Windowtitle”) self.canvas=self.win.addPlot(title=“Plot”) def启动器(自): 如果(sys.flags.interactive!=1)或不是hasattr(QtCore,“PYQT_版本”): QtGui.QApplication.instance() def跟踪(自身、名称、数据集_x、数据集_y): 如果名称在self.traces中:
import time as time
from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler

if __name__ == "__main__":
    patterns = "*"
    ignore_patterns = ""
    ignore_directories = False
    case_sensitive = True
    go_recursively = False
    my_event_handler = PatternMatchingEventHandler(patterns, ignore_patterns, ignore_directories, case_sensitive)

    def on_created(event):
        print(f" {event.src_path} has been created!") #this function should call the plot update

    my_event_handler.on_created = on_created
    path = (r'C:\Users\...') #path from GUI at some point

    my_observer = Observer()
    my_observer.schedule(my_event_handler, path, recursive=go_recursively)
    my_observer.start()

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        my_observer.stop()
        my_observer.join()