2014-10-11 104 views
1

我需要使用PySide和Qt Designer進行的GUI操作。在我的Gui代碼中,我有PlotWidget,我想實現pyqtgraph。在PlotWidget GUI中運行實時pyqtgraph

爲PyQtGraph我想實現(例如一些我上網:) graph.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_() 

這是運行不帶命令行>蟒蛇>進口由於graph.py到pg.QtGui.QApplication.instance().exec_() line

現在我想在我的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 

,現在我的主要PROGRAMM:

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的本身以及何時做出我要求它運行事件(更新實時圖)它說事件已經從主要工作...

請建議我如何能實現運行pyqtgraph到我的GUI:

欣賞了修改後的代碼:

非常感謝你!

+0

某處,未顯示,您必須有一個地方可以創建QApplication實例,創建/顯示您的Ui_MainDialog實例並調用exec_。您只需刪除showBOX中的最後一行即可。 – mdurant 2014-10-11 13:13:12

+0

你好Mdurant,當我從我的showBOX圖表中刪除最後一行不更新.. – 2014-10-11 13:27:10

+0

你如何實例化MainDialog在「主程序」? – mdurant 2014-10-11 13:55:47

回答

3

需要對您的函數進行這些更改:關於保持這些變量的所有內容。在我的系統上,我有特定的錯誤,說變量未定義來幫助解決這個問題。

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) 
+0

你是Genius!它的工作!!!! – 2014-10-11 14:29:19

+0

無論如何mdurant,我有一些小問題。當我按下按鈕時,我得到了圖形更新信息..我想添加按鈕來殺死圖形更新...任何建議如何我可以做到這一點? – 2014-10-11 14:31:17

+0

連接帶插槽的按鈕self.timer.stop – mdurant 2014-10-11 14:35:51