2017-01-18 7 views
1

먼저 길이에 대해 사과드립니다. 나는 나의 문제를 가능한 한 잘 설명하고 싶다. 필자는 Python을 처음 접했고 PyQt4에 임베디드 된 PyQtGraph를 사용하여 플로팅 애플 리케이션을 만들려고했다. 며칠 전 내 plotting problem에 대한 멋진 답변을 얻었고 다음 단계는 같은 PyQt4의 CentralWidget에 simoultaneously 플로팅하는 두 개의 PyQtGraphs 플롯 위젯을 갖는 것입니다. 설명 된 링크에서와 같은 방식으로 두 플롯 모두 제대로 작동하지만 GUI가 응답하지 않게됩니다. 이 문제를 극복하기 위해 QThread을 사용하려고합니다. 그 때문에 다른 클래스에서 플로팅 기능을 사용해야합니다. 하지만 내 변수 덤비는하고, 어떻게 볼 수 없습니다 : 나에게 Plots.plotter에서 오류를 제공PyQt4에서 PyQtGraph로 라이브 플로팅하기 # 2

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(Plots.plotter) 
     self.central_widget.addWidget(self.login_widget) 


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) 


class Plots(MainWindow): 

    def print(self): 
     print('hello World') 

    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) 

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

:

self.data = [0] 
AttributeError: 'bool' object has no attribute 'data' 

를 MainWindow를 클래스에 나는 '버튼을 대체합니다. connect '인수를 Plots.print와 함께 사용하면 문제가 없습니다. 따라서 MainWindow에서 LoginWidget 객체를 만든 다음 Plots이 MainWindow에서 상속되어 동일한 LoginWidget 객체를 다시 호출한다는 사실에 문제가 있음을 알 수 있습니다.

나는 아버지 (MainWindow)가 자식 (Plots)의 메서드에 액세스하지 않는 제안 된 솔루션을 시도했습니다. , 플롯에서, 나는 내 스레드를 배치 목표로 클래스를 호출 할 경우에, 나는 .... 다시 같은 오류가

아버지가 아이들의 메서드에 액세스하지 말아야 상속에서
import sys 
from PyQt4 import QtCore, QtGui 
import pyqtgraph as pg 
import random 


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) 


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.central_widget.addWidget(self.login_widget) 


class Plots(MainWindow): 
    def __init__(self, parent=None): 
     super(Plots, self).__init__(parent=parent) 
     self.login_widget.button.clicked.connect(MyThread.plotter) 



class MyThread(MainWindow): 
    def __init__(self, parent=None): 
     super(Aname, self).__init__(parent=parent) 

    def print(self): 
     print('hello World') 

    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) 


if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    w = Plots() 
    w.show() 
    sys.exit(app.exec_()) 
+1

코드는 나에게 다른 오류를 제공합니다. 'self.login_widget.button.clicked.connect (Plots.plotter)'AttributeError : 'function'객체에 '__pyqtSignature__'속성이 없습니다. – Trilarion

+0

self.login_widget의 Plots.print로 Plots.plotter를 대체 할 때 같은 오류가 발생합니다. button.clicked.connect (Plots.plotter)? – Ivy

답변

2

, 자식 클래스의 부모와 아무 관련이없는 새로운 메서드를 상속하고 구현하는 것이 좋습니다.

타이머 버전

import random 
import sys 

import pyqtgraph as pg 
from PyQt4 import QtGui, QtCore 


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) 
     self.button.clicked.connect(self.plotter) 

    def plotter(self): 
     self.data = [0] 
     self.curve = self.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 MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainWindow, self).__init__(parent) 
     self.centralwidget = QtGui.QWidget(self) 
     self.setCentralWidget(self.centralwidget) 
     self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget) 
     self.login_widget_1 = LoginWidget(self) 
     self.horizontalLayout.addWidget(self.login_widget_1) 

     self.login_widget_2 = LoginWidget(self) 
     self.horizontalLayout.addWidget(self.login_widget_2) 

     self.setCentralWidget(self.centralwidget) 


if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    w = MainWindow() 
    w.show() 
    sys.exit(app.exec_()) 
+0

고마워,하지만 내 문제가 해결되지 않습니다. QThread를 사용하려면 "_ 다른 클래스에서 플로팅 기능을 사용해야합니다." 그래서 MainWindow를 상속 한 새 클래스를 만들고 호출하면 동일한 오류가 발생합니다. 그리고이 경우에는 내가 제안한대로 (MainWindow) 상속받은 클래스에서 내 슬롯 콜 플레이스를 사용하지는 않겠지 만 Plots에서는 내 슬롯 콜을 사용하지 않을 것입니다. – Ivy

+1

@ 아이비 원하는 사진을 넣어 주시겠습니까? – eyllanesc

+0

동일한 위젯에 두 개의 버튼과 두 개의 그래프가 필요합니다. 위의 단일 그래프 예제에서와 같이 각 버튼이 그래프를 트리거하고 위의 단일 그래프 예제와 같이 앱이 계속 응답합니다. – Ivy