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