【问题标题】:Embedding pyqtgraph into tab widget Pyqt将 pyqtgraph 嵌入标签小部件 Pyqt
【发布时间】:2015-04-03 19:03:04
【问题描述】:

我对 Pyqt4 和 pyqtgraph 有点陌生。我有标签小部件,我想将 pyqtgraph 添加到标签小部件中,以便该图将显示在 (tab1) 小部件中。谁能告诉我该怎么做?我应该在标签小部件代码中的哪里添加我的 pyqtgrapgh 代码。 tab widget 和 pyqtgraph 的对应代码如下。 标签小部件的代码:

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(728, 507)
        self.centralWidget = QtGui.QWidget(MainWindow)
        self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
        self.tabWidget = QtGui.QTabWidget(self.centralWidget)
        self.tabWidget.setGeometry(QtCore.QRect(20, 70, 691, 371))
        self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
        self.tab = QtGui.QWidget()
        self.tab.setObjectName(_fromUtf8("tab"))
        self.tabWidget.addTab(self.tab, _fromUtf8(""))
        self.tab_2 = QtGui.QWidget()
        self.tab_2.setObjectName(_fromUtf8("tab_2"))
        self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
        self.label = QtGui.QLabel(self.centralWidget)
        self.label.setGeometry(QtCore.QRect(320, 20, 71, 41))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.label.setFont(font)
        self.label.setObjectName(_fromUtf8("label"))
        MainWindow.setCentralWidget(self.centralWidget)
        self.menuBar = QtGui.QMenuBar(MainWindow)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 728, 21))
        self.menuBar.setObjectName(_fromUtf8("menuBar"))
        MainWindow.setMenuBar(self.menuBar)
        self.mainToolBar = QtGui.QToolBar(MainWindow)
        self.mainToolBar.setObjectName(_fromUtf8("mainToolBar"))
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
        self.statusBar = QtGui.QStatusBar(MainWindow)
        self.statusBar.setObjectName(_fromUtf8("statusBar"))
        MainWindow.setStatusBar(self.statusBar)

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

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QtGui.QApplication.translate("MainWindow", "plot_1", None, QtGui.QApplication.UnicodeUTF8))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QtGui.QApplication.translate("MainWindow", "plot_2", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("MainWindow", "  PLOTS", None, QtGui.QApplication.UnicodeUTF8))


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_())

pyqtgrapgh 的代码:

from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg

app = QtGui.QApplication([])

win = pg.GraphicsWindow(title="Basic plotting examples")
win.resize(1000,600)
win.setWindowTitle('pyqtgraph example: Plotting')

# Enable antialiasing for prettier plots
pg.setConfigOptions(antialias=True)

p6 = win.addPlot(title="My Plot")
curve = p6.plot(pen='r')
data = np.random.normal(size=(10,10))
ptr = 0
def update():
    global curve, data, ptr, p6
    curve.setData(data[ptr%10])
    if ptr == 0:
        p6.enableAutoRange('xy', False)  ## stop auto-scaling after the first data set is plotted
    ptr += 1
timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(500)

## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
        QtGui.QApplication.instance().exec_()

我已经尝试过您建议我的方式,但现在我弹出了两个窗口,但没有一个窗口向我显示情节。我在我的标签小部件中有一个 plotWidget 但我怎样才能摆脱其他绘图窗口?请你告诉我我到底哪里错了。我正在尝试的修改后的代码如下。

from PyQt4 import QtCore, QtGui
from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        global win,curve
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(728, 507)
        self.centralWidget = QtGui.QWidget(MainWindow)
        self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
        self.tabWidget = QtGui.QTabWidget(self.centralWidget)
        self.tabWidget.setGeometry(QtCore.QRect(20, 70, 691, 371))
        self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
        self.tab = QtGui.QWidget()
        self.tab.setObjectName(_fromUtf8("tab"))
        ###
        self.tabWidget.insertTab(3, self.win, "plot")
        ###
        self.tabWidget.addTab(self.tab, _fromUtf8(""))
        self.tab_2 = QtGui.QWidget()
        self.tab_2.setObjectName(_fromUtf8("tab_2"))
        self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
        self.label = QtGui.QLabel(self.centralWidget)
        self.label.setGeometry(QtCore.QRect(320, 20, 71, 41))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.label.setFont(font)
        self.label.setObjectName(_fromUtf8("label"))
        MainWindow.setCentralWidget(self.centralWidget)
        self.menuBar = QtGui.QMenuBar(MainWindow)
        self.menuBar.setGeometry(QtCore.QRect(0, 0, 728, 21))
        self.menuBar.setObjectName(_fromUtf8("menuBar"))
        MainWindow.setMenuBar(self.menuBar)
        self.mainToolBar = QtGui.QToolBar(MainWindow)
        self.mainToolBar.setObjectName(_fromUtf8("mainToolBar"))
        MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
        self.statusBar = QtGui.QStatusBar(MainWindow)
        self.statusBar.setObjectName(_fromUtf8("statusBar"))
        MainWindow.setStatusBar(self.statusBar)

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

def retranslateUi(self, MainWindow):
    MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
    self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QtGui.QApplication.translate("MainWindow", "plot_1", None, QtGui.QApplication.UnicodeUTF8))
    self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QtGui.QApplication.translate("MainWindow", "plot_2", None, QtGui.QApplication.UnicodeUTF8))
    self.label.setText(QtGui.QApplication.translate("MainWindow", "  PLOTS", None, QtGui.QApplication.UnicodeUTF8))

win = pg.GraphicsWindow(title="Basic plotting examples")
win.resize(1000,600)
win.setWindowTitle('pyqtgraph example: Plotting')

# Enable antialiasing for prettier plots
pg.setConfigOptions(antialias=True)

p6 = win.addPlot(title="My Plot")
curve = p6.plot(pen='r')
data = np.random.normal(size=(10,10))
ptr = 0
def update():
    global curve, data, ptr, p6
    curve.setData(data[ptr%10])
    if ptr == 0:
        p6.enableAutoRange('xy', False)  ## stop auto-scaling after the first data set is plotted
    ptr += 1
timer = QtCore.QTimer()
timer.timeout.connect(update)
timer.start(500)



if __name__ == "__main__":
    import sys
    if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
    QtGui.QApplication.instance().exec_()
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

我也收到类似的错误 - NameError:未定义全局名称“曲线” 分段错误(核心转储) 请你告诉我如何摆脱这个错误。

【问题讨论】:

    标签: pyqt4 pyqtgraph


    【解决方案1】:

    你有两个选择:

    1. 使用insertTab(index, win) 将代码中的win 直接添加到标签页。或者,您可以使用 pg.GraphicsLayoutWidget 代替 GraphicsWindow(它们几乎相同,但 GraphicsWindow 有一些细微的变化,使其更方便用作独立小部件)

    2. 使用 Qt Designer 在选项卡内添加一个小部件并将其“提升”到GraphicsLayoutWidget(参见pg docs)。

    【讨论】:

    • 我已经尝试过你建议的方式,但现在我弹出了两个窗口,但没有一个显示图。现在我尝试过的修改代码如下
    【解决方案2】:

    所以我已经更正了一些代码, 1. 首先,你的 pyqtgraph 代码应该在 Class Ui_MainWindow 中。 2. 其次,您必须将绘图小部件添加到布局中才能将其添加到 Tabwidget。 3. 我个人不喜欢使用全局关键字。

    我已经更正了您的代码现在看起来像这样的两件事:

    from PyQt4 import QtCore, QtGui
    from pyqtgraph.Qt import QtGui, QtCore
    import numpy as np
    import pyqtgraph as pg
    
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        _fromUtf8 = lambda s: s
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            global win,curve
            MainWindow.setObjectName(_fromUtf8("MainWindow"))
            MainWindow.resize(728, 507)
            self.centralWidget = QtGui.QWidget(MainWindow)
            self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
            self.win = pg.GraphicsWindow(title="Basic plotting examples")
            #win.resize(1000,600)
            self.win.setWindowTitle('pyqtgraph example: Plotting')
    
            # Enable antialiasing for prettier plots
            pg.setConfigOptions(antialias=True)
    
            self.p6 = self.win.addPlot(title="My Plot")
            self.curve = self.p6.plot(pen='r')
            self.data = np.random.normal(size=(10,10))
            self.ptr = 0
            self.tabWidget = QtGui.QTabWidget(self.centralWidget)
            self.tabWidget.setGeometry(QtCore.QRect(20, 70, 691, 371))
            self.tabWidget.setObjectName(_fromUtf8("tabWidget"))
            self.tab = QtGui.QWidget()
            self.layout1 = QtGui.QVBoxLayout()
            self.layout1.addWidget(self.win)
            self.tab.setLayout(self.layout1)
            self.tab.setObjectName(_fromUtf8("tab"))
            ###
            self.tabWidget.insertTab(3, self.win, "plot")
            ###
            self.tabWidget.addTab(self.tab, _fromUtf8(""))
            self.tab_2 = QtGui.QWidget()
            self.tab_2.setObjectName(_fromUtf8("tab_2"))
            self.tabWidget.addTab(self.tab_2, _fromUtf8(""))
            self.label = QtGui.QLabel(self.centralWidget)
            self.label.setGeometry(QtCore.QRect(320, 20, 71, 41))
            font = QtGui.QFont()
            font.setPointSize(14)
            self.label.setFont(font)
            self.label.setObjectName(_fromUtf8("label"))
            MainWindow.setCentralWidget(self.centralWidget)
            self.menuBar = QtGui.QMenuBar(MainWindow)
            self.menuBar.setGeometry(QtCore.QRect(0, 0, 728, 21))
            self.menuBar.setObjectName(_fromUtf8("menuBar"))
            MainWindow.setMenuBar(self.menuBar)
            self.mainToolBar = QtGui.QToolBar(MainWindow)
            self.mainToolBar.setObjectName(_fromUtf8("mainToolBar"))
            MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar)
            self.statusBar = QtGui.QStatusBar(MainWindow)
            self.statusBar.setObjectName(_fromUtf8("statusBar"))
            MainWindow.setStatusBar(self.statusBar)
    
            self.retranslateUi(MainWindow)
            self.tabWidget.setCurrentIndex(0)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
            timer = QtCore.QTimer()
            timer.timeout.connect(self.update)
            timer.start(500)
    
        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
            self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QtGui.QApplication.translate("MainWindow", "plot_1", None, QtGui.QApplication.UnicodeUTF8))
            self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QtGui.QApplication.translate("MainWindow", "plot_2", None, QtGui.QApplication.UnicodeUTF8))
            self.label.setText(QtGui.QApplication.translate("MainWindow", "  PLOTS", None, QtGui.QApplication.UnicodeUTF8))
    
        def update(self):
            global curve, data, p6
            print "yo"
            self.curve.setData(self.data[self.ptr%10])
            if self.ptr == 0:
                self.p6.enableAutoRange('xy', False)  ## stop auto-scaling after the first data set is plotted
                self.curve = self.p6.plot(pen='r')
            self.ptr += 1
            print "I am here"
    if __name__ == "__main__":
        import sys
        if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
            #QtGui.QApplication.instance().exec_()
            app = QtGui.QApplication(sys.argv)
            MainWindow = QtGui.QMainWindow()
            ui = Ui_MainWindow()
            ui.setupUi(MainWindow)
            MainWindow.show()
            sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 2019-09-18
      • 1970-01-01
      • 2015-07-07
      • 2013-06-29
      • 1970-01-01
      • 2014-02-10
      • 2017-05-31
      • 1970-01-01
      • 2019-03-03
      相关资源
      最近更新 更多