首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQt5中的Mayavi集成:类的含义

PyQt5中的Mayavi集成:类的含义
EN

Stack Overflow用户
提问于 2018-08-23 15:50:00
回答 1查看 361关注 0票数 0

我发现了一种方法,可以将梅亚维图形集成到pyqt5图形用户界面中。

代码语言:javascript
复制
import os
os.environ['ETS_TOOLKIT'] = 'qt5'

from traits.api import HasTraits, Instance, on_trait_change
from traitsui.api import View, Item
from mayavi.core.ui.api import MayaviScene, MlabSceneModel, \
        SceneEditor
################################################################################
#The actual visualization
class Visualization(HasTraits):
    scene = Instance(MlabSceneModel, ())

    @on_trait_change('scene.activated')
    def update_plot(self):
        # This function is called when the view is opened. We don't
        # populate the scene when the view is not yet open, as some
        # VTK features require a GLContext.

        # We can do normal mlab calls on the embedded scene.
        self.scene.mlab.test_points3d()

    # the layout of the dialog screated
    view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene),
                     height=250, width=300, show_label=False),
                resizable=True # We need this to resize with the parent widget
                )

包含可视化的QWidget,这是纯PyQt4代码。

代码语言:javascript
复制
class MayaviQWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        layout = QtGui.QVBoxLayout(self)
        layout.setContentsMargins(0,0,0,0)
        layout.setSpacing(0)
        self.visualization = Visualization()

        # If you want to debug, beware that you need to remove the Qt
        # input hook.
        #QtCore.pyqtRemoveInputHook()
        #import pdb ; pdb.set_trace()
        #QtCore.pyqtRestoreInputHook()

        # The edit_traits call will generate the widget to embed.
        self.ui = self.visualization.edit_traits(parent=self,
                                                 kind='subpanel').control
        layout.addWidget(self.ui)
        self.ui.setParent(self)


if __name__ == "__main__":
    # Don't create a new QApplication, it would unhook the Events
    # set by Traits on the existing QApplication. Simply use the
    # '.instance()' method to retrieve the existing one.
    app = QtGui.QApplication.instance()
    container = QtGui.QWidget()
    container.setWindowTitle("Embedding Mayavi in a PyQt4 Application")
    # define a "complex" layout to test the behaviour
    layout = QtGui.QGridLayout(container)

    # put some stuff around mayavi
    label_list = []
    for i in range(3):
        for j in range(3):
            if (i==1) and (j==1):continue
            label = QtGui.QLabel(container)
            label.setText("Your QWidget at (%d, %d)" % (i,j))
            label.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignVCenter)
            layout.addWidget(label, i, j)
            label_list.append(label)
    mayavi_widget = MayaviQWidget(container)

    layout.addWidget(mayavi_widget, 1, 1)
    container.show()
    window = QtGui.QMainWindow()
    window.setCentralWidget(container)
    window.show()

    # Start the main event loop.
    app.exec_()

我的问题是:由于我是python的初学者,我并不真正理解可视化类()的用途?有没有办法在不创建这个类的情况下让代码运行。我之所以这样问,是因为我有一个现有的gui,我想在其中集成一个mayavi图。在使用matplotlib和canvas...So制作绘图之前,我使用此代码作为将绘图嵌入到我的gui的基础。我删除了Visualization类,但得到了错误:AttributeError: 'MainWindow' object has no attribute 'trait_view'。我想它是在我的类"MainWindow“中搜索trait_view。我不明白为什么,因为我没有使用属性'trait_view'...

EN

回答 1

Stack Overflow用户

发布于 2018-08-24 04:18:05

它实际上是通过trait_view查找view

traits是一个库,它通过在访问成员时调用pre和post函数来提供类型化成员。不仅如此,还提供了一种可扩展的方式,通过python代码甚至图形用户界面小部件与这些特征交互(更多信息here)

您需要Visualization通过这些特征为用户提供与GUI小部件的交互。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51980787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档