2014-10-11 2 views
1

PySide 및 Qt 디자이너로 만든 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을 to 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는 자체로 만든 내가 한 나는 그것을 (실시간 그래프를 업데이 트) 이벤트를 실행하도록 요청 그것은 이미 주요 GUI에서 작동하는 이벤트를 말합니다 ...

난 내 GUI를 실행 pyqtgraph을 구현할 수있는 방법을 제안하십시오 :

가 수정 된 코드에 대한 감사 :

감사합니다 당신이 아주 많이!

+0

, 당신은 당신의 Ui_MainDialog 인스턴스를 표시/생성, 당신은의 QApplication 인스턴스를 만들 장소를 가지고 있고, exec_를 호출해야합니다. showBOX의 마지막 줄을 제거하기 만하면됩니다. – mdurant

+0

Hello Mdurant, 내 showBOX 그래프에서 마지막 줄을 제거하지 않을 때 .. –

+0

MainDialog를 "main program"에서 어떻게 인스턴스화합니까? – mdurant

답변

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!가 작동 중입니다 !!!! –

+0

어쨌든 mdurant, 나는 약간의 질문이있다. 내가 버튼을 누르면 정보를 업데이트하는 그래프를 얻었습니다. 그래프 업데이트를 죽일 버튼을 추가하고 싶습니다 ... 어떤 제안을 할 수 있습니까? –

+0

슬롯이있는 버튼을 self.timer.stop – mdurant