Mayavi: настройка панели инструментов - PullRequest
0 голосов
/ 06 сентября 2018

Есть ли способ настроить панель инструментов по умолчанию для сцены майави? Я хотел бы удалить некоторые кнопки, поскольку они мне не нужны (например, кнопка сохранения). Здесь вы можете увидеть, о какой панели инструментов я говорю: enter image description here

Код только пример кода:

import os
os.environ['ETS_TOOLKIT'] = 'qt4'
from pyface.qt import QtGui, QtCore
from traits.api import HasTraits, Instance, on_trait_change
from traitsui.api import View, Item
from mayavi.core.ui.api import MayaviScene, MlabSceneModel, SceneEditor
from tvtk.pyface.api import DecoratedScene
from pyface.api import ImageResource
from pyface.action.api import Action

class MyCustomScene(DecoratedScene):

    def _actions_default(self):
        actions = [ 
                Action(
                    image = ImageResource("path to image",
                        search_path = [self._get_image_path()],
                        ),
                    tooltip = "blabla",
                    on_perform = self._save_snapshot,
                    )
                ]
        actions.extend(DecoratedScene._actions_default(self))
        return actions

#The actual visualization
class Visualization(HasTraits):
    scene = Instance(MlabSceneModel, ())

    @on_trait_change('scene.activated')
    def update_plot(self):
        # 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=MyCustomScene),
                     height=250, width=300, show_label=False),
                resizable=True # We need this to resize with the parent widget
                )
################################################################################
# The QWidget containing the visualization, this is pure PyQt4 code.
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()

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

Я думаю, что это где-то спрятано в MayaviScene. Может быть, необходимо создать новый класс с новой сценой или что-то вроде этого?

1 Ответ

0 голосов
/ 07 сентября 2018

Вы должны проверить _actions_default для MayaviScene и для DecoratedScene, чтобы увидеть, как создать свой собственный. Второй показывает, как создать панель инструментов с нуля, а первый показывает, как код панели инструментов взаимодействует с другими компонентами.

class MyCustomScene(DecoratedScene):
    # …
    def _actions_default(self):
        actions = [ 
                # add icons here
                # … 
                ]
        return actions
...