在pyqt4中遇到pyqtgraph的问题

时间:2017-08-22 17:10:05

标签: python-2.7 pyqt4 pyqtgraph

我试图将我的程序归结为尽可能简单并且仍然可以正常运行。首先是我的UI文件,其中包含我想要的选项卡。它在“控制”选项卡中有一个图形,我想要播放按钮来启动绘图。 当我启动它时,我无法显示图形。任何帮助将不胜感激。

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(800, 600)
        self.centralwidget = QtGui.QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.tabWidget = QtGui.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(0, 0, 801, 421))
        self.tabWidget.setStyleSheet(_fromUtf8(""))
        self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
        self.tab_4 = QtGui.QWidget()
        self.tab_4.setObjectName(_fromUtf8("tab_4"))
        self.tabWidget.addTab(self.tab_4, _fromUtf8(""))
        self.tab_2 = QtGui.QWidget()
        self.tab_2.setObjectName(_fromUtf8("tab_2"))
        self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
        self.tab = QtGui.QWidget()
        self.tab.setObjectName(_fromUtf8("tab"))
        self.pushButton = QtGui.QPushButton(self.tab)
        self.pushButton.setGeometry(QtCore.QRect(290, 340, 75, 31))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(_fromUtf8("play_button.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.pushButton.setIcon(icon)
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.pushButton_2 = QtGui.QPushButton(self.tab)
        self.pushButton_2.setGeometry(QtCore.QRect(460, 340, 75, 31))
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap(_fromUtf8("pause_button.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.pushButton_2.setIcon(icon1)
        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
        self.pushButton_3 = QtGui.QPushButton(self.tab)
        self.pushButton_3.setGeometry(QtCore.QRect(630, 340, 75, 31))
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap(_fromUtf8("resume_button.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.pushButton_3.setIcon(icon2)
        self.pushButton_3.setObjectName(_fromUtf8("pushButton_3"))
        self.graphicsView = QtGui.QGraphicsView(self.tab)
        self.graphicsView.setGeometry(QtCore.QRect(205, 1, 591, 341))
        self.graphicsView.setObjectName(_fromUtf8("graphicsView"))
        self.tabWidget.addTab(self.tab, _fromUtf8(""))
        self.tab_3 = QtGui.QWidget()
        self.tab_3.setObjectName(_fromUtf8("tab_3"))
        self.tabWidget.addTab(self.tab_3, _fromUtf8(""))
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtGui.QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(2)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _translate("MainWindow", "Calibration", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Material", None))
        self.pushButton.setText(_translate("MainWindow", "Start Plot", None))
        self.pushButton_2.setText(_translate("MainWindow", "Pause", None))
        self.pushButton_3.setText(_translate("MainWindow", "Resume", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Control", None))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Operator", None))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
sys.exit(app.exec_())

第二个是我的图形类,当我用代码制作一个gui时它可以工作,但我希望能够将它插入带有ui文件的程序中。

import sys
import time
import datetime
from PyQt4 import QtCore, QtGui, uic
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import pyqtgraph as pg
import random
from workingraspitab2 import Ui_MainWindow

class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.setupUi(self)
        self.graphicsView = QtGui.QStackedWidget()
        self.login_widget = LoginWidget(self)
        self.graphicsView.addWidget(self.login_widget)
        self.pushButton.clicked.connect(self.plotter)#the play button
        self.curve = self.login_widget.it1
        self.curve2 =self.login_widget.it2


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

    def updater(self):
        self.data.append(self.data[-1]+10*(0.5-random.random())) 
        self.curve.setData(self.data, pen=pg.mkPen('b', width=1))
        self.data2.append(self.data2[-1]+0.1*(0.5-random.random()))
        self.curve2.setData(self.data2, pen=pg.mkPen('r', width=1))
        print self.data

class LoginWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(LoginWidget, self).__init__(parent)
        pg.setConfigOption('background', 'w')
        pg.setConfigOption('foreground', 'k')     
        self.plot = pg.PlotWidget(title='Force and Extension vs. Time')
        p1 = self.plot.plotItem
        p2 = pg.ViewBox()
        p1.showAxis('right')
        p1.scene().addItem(p2)
        p1.getAxis('right').linkToView(p2)
        p2.setXLink(p1)

        self.plot.getAxis('bottom').setLabel('Time', units='s')
        self.plot.getAxis('left').setLabel('Force', units='lbf', color="#0000ff")
        p1.getAxis('right').setLabel('Extension', units='in.', color="#ff0000")

        def updateViews():
            p2.setGeometry(p1.vb.sceneBoundingRect())
            p2.linkedViewChanged(p1.vb, p2.XAxis)

        updateViews()
        p1.vb.sigResized.connect(updateViews)

        self.it1 = p1.plot()
        self.it2 = pg.PlotCurveItem()
        p2.addItem(self.it2)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Main()
    window.show()
    sys.exit(app.exec_())

1 个答案:

答案 0 :(得分:1)

必须将所有内容放在Main类中才能使其工作。我希望有一个更优雅的解决方案。我仍然无法改变背景或前景,但它正在运行,这是代码:

class Main(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)
        self.setupUi(self)
        pv = self.graphicsView
        pv.setTitle('Force and Extension vs. Time')
        pg.setConfigOption('background', 'w')
        pg.setConfigOption('foreground', 'k')
        p1 = pv.plotItem
        p2 = pg.ViewBox()
        p1.showAxis('right')
        p1.scene().addItem(p2)
        p1.getAxis('right').linkToView(p2)
        p2.setXLink(p1)
        pv.getAxis('bottom').setLabel('Time', units='s')
        pv.getAxis('left').setLabel('Force', units='lbf', color="#0000ff")
        p1.getAxis('right').setLabel('Extension', units='in.', color="#ff0000")
        def updateViews():
            p2.setGeometry(p1.vb.sceneBoundingRect())
            p2.linkedViewChanged(p1.vb, p2.XAxis)
        updateViews()
        p1.vb.sigResized.connect(updateViews)
        self.it1 = p1.plot()
        self.it2 = pg.PlotCurveItem()
        p2.addItem(self.it2)

        self.pushButton.clicked.connect(self.plotter)
        self.pushButton_2.clicked.connect(lambda: self.timer.stop())
        self.pushButton_3.clicked.connect(self.timer_start)
        self.curve = self.it1
        self.curve2 = self.it2