2017-01-16 6 views
3

저는 Python에서 매우 새로운 기능을 제공하고 PyQt4 앱을 만들려고합니다. 여기에 PyQtGraph가 포함되어 있습니다. 나는 환상적으로 작동이 PyQtGraph 라이브 플로터있어 : 더 큰 PyQt4 응용 프로그램에 내장 들어PyQt4에서 PyQtGraph로 라이브 플로팅

from pyqtgraph.Qt import QtGui, QtCore 
import pyqtgraph as pg 
import random 

app = QtGui.QApplication([]) 
p = pg.plot() 
curve = p.plot() 
data = [0] 

def updater(): 

    data.append(random.random()) 
    curve.setData(data) #xdata is not necessary 


timer = QtCore.QTimer() 
timer.timeout.connect(updater) 
timer.start(0) 

if __name__ == '__main__': 
    import sys 
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'): 
     QtGui.QApplication.instance().exec_() 

을, 나는 pyqtgraph.PlotWidget() 포함을위한 레이아웃이 필요합니다. 그 문제에 관해서는 MainWindow에 centralWidget을 설정했습니다. 그 이전의 코드가하는 것처럼 플롯 시작해야, 버튼을 만들,하지만 난 플로터 기능을 통해 업데이트 프로그램 함수를 호출 할 때 그냥 아무 반응이 없습니다 :

import sys 
from PyQt4 import QtCore, QtGui 
import pyqtgraph as pg 
import random 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.central_widget = QtGui.QStackedWidget() 
     self.setCentralWidget(self.central_widget) 
     login_widget = LoginWidget(self)#to say where the button is 
     login_widget.button.clicked.connect(self.plotter) 
     self.central_widget.addWidget(login_widget) 

    def plotter(self): 
     self.data =[0] 
     timer = QtCore.QTimer() 
     timer.timeout.connect(self.updater) 
     timer.start(0) 

    def updater(self): 

     self.data.append(random.random()) 
     plot.setData(self.data) 

class LoginWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     global plot 
     super(LoginWidget, self).__init__(parent) 
     layout = QtGui.QHBoxLayout() 
     self.button = QtGui.QPushButton('Start Plotting') 
     layout.addWidget(self.button) 
     plot = pg.PlotWidget() 
     layout.addWidget(plot) 
     self.setLayout(layout) 

if __name__ == '__main__': 
    app = QtGui.QApplication([]) 
    window = MainWindow() 
    window.show() 
    app.exec_() 

아무것도 내가 스레드해야하기 때문에 일이 없다?

답변

2

에 대한 참조를 만들 수 있습니다.
먼저 @ luddek의 답변과 같은 방향으로 가면 변수를 추적해야합니다. 클래스 메소드 내에 변수를 정의하고이 클래스 메소드가 실행을 완료하면 변수가 손실됩니다. 또한 외부에서 볼 수 없습니다.
따라서 클래스 변수를 사용하는 것이 좋습니다 ,
self.plot 대신도 timer
self.login_widget 대신 login_widget
(대신 plot
self.timer가 있지만, I는 PyQt는 프로그램에 있으며이 프로그램 global를 사용하여 recomment 않을 것 유효한 코드)

다음으로 PlotWidget에는 setData 메서드가 없습니다. PlotItem의 플롯에 데이터를 플롯하는 것은 좀 더 복잡합니다 :
pg.PlotWidget().getPlotItem()을 통해 얻을 수있는 PlotItem입니다. 그런 다음 데이터를 추가하려는 실제 커브를 반환하는 plot()을 호출해야합니다. 아래 예에서 나는 데이터를 추가 할 수있는 새로운 변수 self.curve을 소개했습니다. self.curve.setData(self.data)

여기는 완전한 작동 코드입니다.

from PyQt4 import QtCore, QtGui 
import pyqtgraph as pg 
import random 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.central_widget = QtGui.QStackedWidget() 
     self.setCentralWidget(self.central_widget) 
     self.login_widget = LoginWidget(self) 
     self.login_widget.button.clicked.connect(self.plotter) 
     self.central_widget.addWidget(self.login_widget) 

    def plotter(self): 
     self.data =[0] 
     self.curve = self.login_widget.plot.getPlotItem().plot() 

     self.timer = QtCore.QTimer() 
     self.timer.timeout.connect(self.updater) 
     self.timer.start(0) 

    def updater(self): 

     self.data.append(self.data[-1]+0.2*(0.5-random.random())) 
     self.curve.setData(self.data) 

class LoginWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(LoginWidget, self).__init__(parent) 
     layout = QtGui.QHBoxLayout() 
     self.button = QtGui.QPushButton('Start Plotting') 
     layout.addWidget(self.button) 
     self.plot = pg.PlotWidget() 
     layout.addWidget(self.plot) 
     self.setLayout(layout) 

if __name__ == '__main__': 
    app = QtGui.QApplication([]) 
    window = MainWindow() 
    window.show() 
    app.exec_() 
+0

감사합니다. @ImportanceOfBeingErnest, 저는 실제로 변수 범위를 이해하고 실행하려고 노력하고 있지만 시간이 좀 걸립니다. 운이 좋은 너희들은 열정적 인 프로그래머 :-) 또한 설명서에서 pg.PlotWidget() 올바른 사용을 찾지 못했습니다 ..... 다시 한번 감사드립니다! – Ivy

+1

이 문제가 해결 된 경우 [수락] (http://meta.stackexchange.com/a/5235)을 고려하십시오. 적절하지 않은 경우 질문을 수정하십시오. – ImportanceOfBeingErnest

2

updater() 가비지 수집기에서 타이머를 제거했기 때문에 호출되지 않았습니다.

타이머 어딘가에 참조를 유지해야합니다. 당신은 예를 들어 코드에서 고려해야 할 몇 가지가 있습니다 __init__

def __init__(self, parent=None): 
    ... 
    self.timer = QtCore.QTimer() 
+1

이 과정이 올바르지 만 타이머가 가비지 수집되는 것을 방지하는 것은 전체적인 문제의 일부일뿐입니다. – ImportanceOfBeingErnest