2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > python 3d图形控件 可交互_python – 在PySide中嵌入交互式3D绘图

python 3d图形控件 可交互_python – 在PySide中嵌入交互式3D绘图

时间:2018-12-26 19:04:19

相关推荐

python 3d图形控件 可交互_python – 在PySide中嵌入交互式3D绘图

在PySide GUI中嵌入交互式3D绘图的最佳方法是什么?我在这里看了一些关于PySide GUI中嵌入的2D图的例子:

但是,我正在寻找的功能并不完全相同.该图需要根据用户的鼠标输入进行旋转和缩放,就像在单独的窗口中绘制一样.

我试图避免必须手动进入并编写函数来将鼠标单击移动转换为图形旋转和画布重绘 – 即使这是唯一的方法,我甚至不知道如何做到这一点.但我认为(应该没有双关语)应该有一种方法可以重用已经存在的功能,用于在自己的窗口中创建3D绘图.

这是我的代码.它按预期工作,但情节不是交互式的.任何建议表示赞赏!

编辑:我根据tcaswell的更正修复了使用FigureCanvas.我还从matplotlib Event Handling and Picking文档中添加了一些内容,以显示该图似乎是在鼠标点击时获取事件.

最终编辑:以下代码现在根据需要生成绘图.

# -*- coding: utf-8 -*-

from PySide import QtCore, QtGui

import numpy as np

import matplotlib

import sys

# specify the use of PySide

matplotlib.rcParams['backend.qt4'] = "PySide"

# import the figure canvas for interfacing with the backend

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg \

as FigureCanvas

# import 3D plotting

from mpl_toolkits.mplot3d import Axes3D # @UnusedImport

from matplotlib.figure import Figure

# Auto-generated code from QT Designer ----------------------------------------

class Ui_MainWindow(object):

def setupUi(self, MainWindow):

MainWindow.setObjectName("MainWindow")

MainWindow.resize(750, 497)

self.centralwidget = QtGui.QWidget(MainWindow)

self.centralwidget.setObjectName("centralwidget")

self.horizontalLayout_2 = QtGui.QHBoxLayout(self.centralwidget)

self.horizontalLayout_2.setObjectName("horizontalLayout_2")

self.frame_2 = QtGui.QFrame(self.centralwidget)

self.frame_2.setFrameShape(QtGui.QFrame.StyledPanel)

self.frame_2.setFrameShadow(QtGui.QFrame.Raised)

self.frame_2.setObjectName("frame_2")

self.verticalLayout = QtGui.QVBoxLayout(self.frame_2)

self.verticalLayout.setObjectName("verticalLayout")

self.label = QtGui.QLabel(self.frame_2)

self.label.setObjectName("label")

self.verticalLayout.addWidget(self.label)

self.label_2 = QtGui.QLabel(self.frame_2)

self.label_2.setObjectName("label_2")

self.verticalLayout.addWidget(self.label_2)

self.lineEdit = QtGui.QLineEdit(self.frame_2)

sizePolicy = QtGui.QSizePolicy(

QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)

sizePolicy.setHorizontalStretch(0)

sizePolicy.setVerticalStretch(0)

sizePolicy.setHeightForWidth(

self.lineEdit.sizePolicy().hasHeightForWidth())

self.lineEdit.setSizePolicy(sizePolicy)

self.lineEdit.setObjectName("lineEdit")

self.verticalLayout.addWidget(self.lineEdit)

spacerItem = QtGui.QSpacerItem(

20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)

self.verticalLayout.addItem(spacerItem)

self.horizontalLayout_2.addWidget(self.frame_2)

self.frame_plot = QtGui.QFrame(self.centralwidget)

self.frame_plot.setMinimumSize(QtCore.QSize(500, 0))

self.frame_plot.setFrameShape(QtGui.QFrame.StyledPanel)

self.frame_plot.setFrameShadow(QtGui.QFrame.Raised)

self.frame_plot.setObjectName("frame_plot")

self.horizontalLayout_2.addWidget(self.frame_plot)

MainWindow.setCentralWidget(self.centralwidget)

self.retranslateUi(MainWindow)

QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):

MainWindow.setWindowTitle(QtGui.QApplication.translate(

"MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))

self.label.setText(QtGui.QApplication.translate("MainWindow",

"This is a qlabel.", None, QtGui.QApplication.UnicodeUTF8))

self.label_2.setText(QtGui.QApplication.translate("MainWindow",

"And this is another one.", None, QtGui.QApplication.UnicodeUTF8))

self.lineEdit.setText(QtGui.QApplication.translate("MainWindow",

"Text goes here.", None, QtGui.QApplication.UnicodeUTF8))

# Auto-generated code from QT Designer ----------------------------------------

class MainWindow(QtGui.QMainWindow):

def __init__(self, parent=None):

super(MainWindow, self).__init__(parent)

# intialize the window

self.ui = Ui_MainWindow()

self.ui.setupUi(self)

# create the matplotlib widget and put it in the frame on the right

self.ui.plotWidget = Mpwidget(parent=self.ui.frame_plot)

class Mpwidget(FigureCanvas):

def __init__(self, parent=None):

self.figure = Figure(facecolor=(0, 0, 0))

super(Mpwidget, self).__init__(self.figure)

self.setParent(parent)

# plot random 3D data

self.axes = self.figure.add_subplot(111, projection='3d')

self.data = np.random.random((3, 100))

self.axes.plot(self.data[0, :], self.data[1, :], self.data[2, :])

if __name__ == "__main__":

app = QtGui.QApplication(sys.argv)

mw = MainWindow()

mw.show()

# adjust the frame size so that it fits right after the window is shown

s = mw.ui.frame_plot.size()

mw.ui.plotWidget.setGeometry(1, 1, s.width() - 2, s.height() - 2)

sys.exit(app.exec_())

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。