在 PlotWidget GUI 中运行实时 pyqtgraph
Posted
技术标签:
【中文标题】在 PlotWidget GUI 中运行实时 pyqtgraph【英文标题】:Run Real-time pyqtgraph in PlotWidget GUI 【发布时间】:2014-12-06 13:01:22 【问题描述】:我需要一些关于我使用 PySide 和 Qt Designer 制作的 GUI 的帮助。在我的 Gui 代码中,我有 PlotWidget,我想在其中实现 pyqtgraph。
我正在尝试实现的 PyQtGraph 的代码(我在互联网上找到的一些示例:) 图.py:
import pyqtgraph as pg
import numpy as np
plt = pg.plot()
bufferSize = 1000
data = np.zeros(bufferSize)
curve = plt.plot()
line = plt.addLine(x=0)
plt.setRange(xRange=[0, bufferSize], yRange=[-50, 50])
i = 0
def update():
global data, curve, line, i
n = 10 # update 10 samples per iteration
rand = np.random.normal(size=n)
data[i:i+n] = np.clip(data[i-1] + rand, -50, 50)
curve.setData(data)
i = (i+n) % bufferSize
line.setValue(i)
timer = pg.QtCore.QTimer()
timer.timeout.connect(update)
timer.start(20)
pg.QtGui.QApplication.instance().exec_()
这是在没有命令行的情况下运行> python> import graph.py 由于pg.QtGui.QApplication.instance().exec_()
行
现在我想在我的 GUI 的 Plot Widget 中运行这个随机绘图。
来自 QtDesigner 的代码:
from PySide import QtCore, QtGui
class Ui_MainDialog(object):
def setupUi(self, MainDialog):
MainDialog.setObjectName("MainDialog")
MainDialog.resize(400, 300)
self.nameEdit = QtGui.QLineEdit(MainDialog)
self.nameEdit.setGeometry(QtCore.QRect(30, 50, 181, 31))
self.nameEdit.setText("")
self.nameEdit.setObjectName("nameEdit")
self.showButton = QtGui.QPushButton(MainDialog)
self.showButton.setGeometry(QtCore.QRect(250, 50, 101, 31))
self.showButton.setObjectName("showButton")
self.MainGraph = PlotWidget(MainDialog)
self.MainGraph.setGeometry(QtCore.QRect(70, 100, 256, 192))
self.MainGraph.setObjectName("MainGraph")
self.retranslateUi(MainDialog)
QtCore.QMetaObject.connectSlotsByName(MainDialog)
MainDialog.setTabOrder(self.showButton, self.nameEdit)
MainDialog.setTabOrder(self.nameEdit, self.MainGraph)
def retranslateUi(self, MainDialog):
MainDialog.setWindowTitle(QtGui.QApplication.translate("MainDialog", "MainDialog", None, QtGui.QApplication.UnicodeUTF8))
self.nameEdit.setPlaceholderText(QtGui.QApplication.translate("MainDialog", "Log Window", None, QtGui.QApplication.UnicodeUTF8))
self.showButton.setText(QtGui.QApplication.translate("MainDialog", "Show Graph!", None, QtGui.QApplication.UnicodeUTF8))
from pyqtgraph import PlotWidget
现在我的主程序:
from PySide.QtCore import *
from PySide.QtGui import *
import example3
import sys
class Maindialog(QDialog,example3.Ui_MainDialog):
def __init__(self, parent=None):
super(Maindialog,self).__init__(parent)
self.setupUi(self)
self.connect(self.showButton,SIGNAL("clicked()"),self.showBOX)
def showBOX(self):
QMessageBox.information(self, "hello", "hello there " + self.nameEdit.text())
print"hello world"
plt=self.MainGraph
#z.plot(x = [0, 1, 2, 4,7,8,9,0], y = [4, 5, 9, 6,1,2,3,4])
import numpy as np
import pyqtgraph as pg
bufferSize = 1000
data = np.zeros(bufferSize)
curve = plt.plot()
curve.setData()
line = plt.addLine(x=0)
plt.setRange(xRange=[0, bufferSize], yRange=[-50, 50])
i = 0
def update():
global data, curve, line, i
n = 10 # update 10 samples per iteration
rand = np.random.normal(size=n)
data[i:i+n] = np.clip(data[i-1] + rand, -50, 50)
curve.setData(data)
i = (i+n) % bufferSize
line.setValue(i)
timer = pg.QtCore.QTimer()
timer.timeout.connect(update)
timer.start(20)
if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
pg.QtGui.QApplication.instance().exec_()
我有错误QCoreApplication::exec: The event loop is already running
我部分理解了这个问题,Pyqtgraph 是用 PyQt 本身制作的,当我要求它运行事件(更新实时图)时,它说该事件已经从主 gui 工作......
请建议我如何在我的 gui 中实现运行 pyqtgraph:
感谢修改后的代码:
非常感谢!
【问题讨论】:
某处,未显示,你必须有一个地方,你可以创建一个 QApplication 实例,创建/显示你的 Ui_MainDialog 实例,并调用 exec_。您需要做的就是删除 showBOX 中的最后一行。 你好 Mdurant,当我从我的 showBOX 图中删除最后一行时没有更新.. 如何在“主程序”中实例化MainDialog? 顺便说一下,showBOX 中的“timer”会在函数结束时超出范围并被删除。您应该将引用存储为实例变量self.timer = timer
。
您好 mdurant,MainDialog 只是对 example3 的重新实现(我从 Qt 设计器获得的代码 - 我的消息中的第二个代码框。如果您能帮助我解决这个问题,我们将不胜感激
【参考方案1】:
需要对您的函数进行这些更改:所有这些更改都是为了保持这些变量。在我的系统上,我遇到了特定错误,指出未定义变量以帮助解决此问题。
def showBOX(self):
QMessageBox.information(self, "hello", "hello there " + self.nameEdit.text())
print"hello world"
plt=self.MainGraph
#z.plot(x = [0, 1, 2, 4,7,8,9,0], y = [4, 5, 9, 6,1,2,3,4])
import numpy as np
import pyqtgraph as pg
bufferSize = 1000
self.data = np.zeros(bufferSize)
self.curve = plt.plot()
self.curve.setData()
self.line = plt.addLine(x=0)
plt.setRange(xRange=[0, bufferSize], yRange=[-50, 50])
self.i = 0
def update():
n = 10 # update 10 samples per iteration
rand = np.random.normal(size=n)
self.data[self.i:self.i+n] = np.clip(self.data[self.i-1] + rand, -50, 50)
self.curve.setData(self.data)
self.i = (self.i+n) % bufferSize
self.line.setValue(self.i)
self.update = update
self.timer = pg.QtCore.QTimer()
self.timer.timeout.connect(self.update)
self.timer.start(20)
【讨论】:
无论如何,我有一些小问题。当我按下按钮时,我得到了更新信息的图表..我还想添加按钮来终止图表更新......有什么建议我该怎么做? 用槽 self.timer.stop 连接按钮 刚刚添加了 self.timer.stop()。上帝保佑你:) 非常感谢你! @PavelGolubev 您应该接受答案,以便它关闭并感谢其作者。 确实会很感激 :)以上是关于在 PlotWidget GUI 中运行实时 pyqtgraph的主要内容,如果未能解决你的问题,请参考以下文章