【问题标题】:Mayavi integration in PyQt5: Meaning of classPyQt5 中的 Mayavi 集成:类的含义
【发布时间】:2018-08-23 07:50:00
【问题描述】:

我找到了一种将 mayavi 图集成到 pyqt5 gui 中的方法。

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代码。

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 和画布绘制绘图之前...所以我使用此代码作为将绘图嵌入到我的 gui 的基础。我删除了可视化类,但出现错误:AttributeError: 'MainWindow' object has no attribute 'trait_view'。我认为它正在我的类“MainWindow”中搜索 trait_view。我不明白为什么,因为我没有使用属性'trait_view'......

【问题讨论】:

    标签: python class pyqt5 mayavi


    【解决方案1】:

    它实际上在寻找viewtrait_view

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2019-09-20
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多