2015-02-04 6 views
0

Я немного новичок в Pyqt4 и pyqtgraph. У меня есть виджет вкладки со мной, и я хочу добавить pyqtgraph в виджет вкладки, так что этот график будет отображаться внутри (tab1) виджет. Может ли кто-нибудь сказать мне, как я могу это сделать? где я должен добавить свой код pyqtgrapgh в код виджета вкладки. Соответствующий код для виджета вкладки и pyqtgraph выглядит следующим образом. код виджета со вкладками:Вставка pyqtgraph в виджет вкладки Pyqt

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 в моей вкладке Widget, но как я могу избавиться от другого окна графика? Не могли бы вы рассказать мне, где я точно ошибаюсь. Модифицированный код, который я пытаюсь сделать, выглядит следующим образом.

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: глобальное имя «кривой» не определен ошибки сегментации (ядро сбрасывали) ли вы сказать мне, как избавиться от этой ошибки.

ответ

1

У вас есть два варианта:

  1. Добавить win в коде непосредственно на закладке с помощью insertTab(index, win). При желании вы можете использовать pg.GraphicsLayoutWidget вместо GraphicsWindow (они почти идентичны, но GraphicsWindow имеет незначительные изменения, которые делают его более удобным для использования в качестве автономного виджета)

  2. Использование Qt Designer, чтобы добавить виджет внутри вкладки и «содействовать «это до GraphicsLayoutWidget (см. pg docs).

+0

я попытался, как вы предложили, но теперь я получаю два окна выскочил ни с одной из них показывает участки. Теперь измененный код, который я попробовал, выглядит следующим образом – Ankush

1

Так я исправил код, 1. Во-первых, Ваш код pyqtgraph должен быть внутри класса 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_()) 
Смежные вопросы