2017-01-18 10 views
1

まず、長さは申し訳ありません。私は問題をできるだけ良く説明したい。私はPythonには新しく、PyQt4に埋め込まれたPyQtGraphを使ってプロットアプリを作ろうとしています。数日前、私はplotting problemに本当に素敵な答えを得ました。私の次のステップは、同じPyQt4のCentralWidgetにsimoultaneouslyプロットする2つのPyQtGraphsプロットウィジェットを持つことです。説明されているリンクと同じアプローチで、両方のプロットは正常に動作しますが、GUIは応答しなくなります。これを克服するために、QThreadを使用することを目指しています。そのために、私は異なるクラスでプロット関数を用意する必要があります。しかし、私は私の変数をいじっていて、どのように見ることができない。私はPlots.plotterでエラーが発生しますPyQt4#2でのPyQtGraphによるライブプロット

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' 

をメイン・ウィンドウクラスで、私は「ボタンを置き換えた場合。 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

@Ivy あなたはあなたが望むものを置くことができますか? – eyllanesc

+0

同じウィジェット内に2つのボタンと2つのグラフが必要です。上記の単一のグラフの例のように、各ボタンがグラフをトリガーし、上記の単一のグラフの例のように、アプリケーションは応答性があります。 – Ivy

関連する問題