Felix
Felix

Reputation: 3581

Is it possible to embed mayavi plot into PyQt5 widget?

I have a PyQt5 application and want to embed mayavi surface plot into one of my widgets. Is it somehow possible?

Upvotes: 0

Views: 365

Answers (2)

Sasha Sen
Sasha Sen

Reputation: 75

FYI this is now possible. Here is a sample:

from PyQt5 import QtWidgets, QtCore
import numpy as np
from traits.api import HasTraits, Instance, on_trait_change
from traitsui.api import View, Item
from mayavi.core.ui.api import MayaviScene, MlabSceneModel, SceneEditor
import sys
import os
os.environ['ETS_TOOLKIT'] = 'qt4'


class Visualization(HasTraits):
    scene = Instance(MlabSceneModel, ())

    @on_trait_change('scene.activated')
    def update_plot(self):
        x, y = np.mgrid[-5:5:100j, -5:5:100j]
        z = np.random.random(x.shape) * 10
        # Creating the surface plot
        self.scene.mlab.surf(x, y, z, colormap='cool')
        self.scene.background = (1, 1, 1)

    view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene),
                     height=250, width=300, show_label=False),
                resizable=True)


class MayaviQWidget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        layout = QtWidgets.QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)
        self.visualization = Visualization()

        self.ui = self.visualization.edit_traits(parent=self,
                                                 kind='subpanel').control
        layout.addWidget(self.ui)
        self.ui.setParent(self)


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setGeometry(200, 200, 1100, 700)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        container = QtWidgets.QWidget()
        mayavi_widget = MayaviQWidget(container)
        self.gridLayout.addWidget(mayavi_widget, 0, 0, 0, 0)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Simulator"))


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle('Fusion')
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

The output looks like this: surface_example_pyqt5_and_mayavi

Upvotes: 2

P-Gn
P-Gn

Reputation: 24581

As a prerequisite of the present mayavi 4.5 is

Qt version 4.8 with either PyQt 4.11.4 or PySide 1.2.2,

it is unlikely that you can embed it in PyQt5.

Upvotes: 1

Related Questions