我发现了一种方法,可以将梅亚维图形集成到pyqt5图形用户界面中。
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和canvas...So制作绘图之前,我使用此代码作为将绘图嵌入到我的gui的基础。我删除了Visualization类,但得到了错误:AttributeError: 'MainWindow' object has no attribute 'trait_view'。我想它是在我的类"MainWindow“中搜索trait_view。我不明白为什么,因为我没有使用属性'trait_view'...
发布于 2018-08-24 04:18:05
它实际上是通过trait_view查找view。
traits是一个库,它通过在访问成员时调用pre和post函数来提供类型化成员。不仅如此,还提供了一种可扩展的方式,通过python代码甚至图形用户界面小部件与这些特征交互(更多信息here)
您需要Visualization通过这些特征为用户提供与GUI小部件的交互。
https://stackoverflow.com/questions/51980787
复制相似问题