gpt4 book ai didi

python - Pyside 中的 Matplotlib 与 Qt 设计器 (PySide)

转载 作者:太空狗 更新时间:2023-10-29 20:19:54 31 4
gpt4 key购买 nike

我一直在寻找一个工作示例,该示例如何在使用 QT 设计器创建的 pyside 中嵌入 matplotlib 图,同时将逻辑保存在单独的文件中。我知道网上有很多例子,但没有一个真正使用 QT 设计器,然后创建一个单独的文件来添加将 matplitlib 图添加到小部件的逻辑。我找到了一个“几乎”有效的例子 http://blog.rcnelson.com/building-a-matplotlib-gui-with-qt-designer-part-1/但在我的版本中,无法“将 layoutName 属性从“verticalLayout”更改为“mplvl”。

所以我有以下具体问题:我不清楚 Pyside Qt 设计器中可以嵌入哪些项目。它是一个简单的“小部件”吗(因为 pyside 中没有可用的 matplotlib 小部件)。如果是这样,我该如何将情节添加到该小部件?或者我是否必须使用 Qt Designer 创建一个“FigureCanvas”?这可能吗?如果是,怎么办?

这是我可以使用 Pyside Qt 设计器在嵌入小部件时进行的最简单的设计(正确吗?)。我现在如何在其上添加 matplotlib 图?

正如其中一个答案所建议的那样,我现在已将 Qwidget 提升为 MyStaticMplCanvas 并将 Qwidget 的名称编辑为 mplvl。

使用 Pyside Qt 设计器自动生成文件并使用pyside-uic ui.ui -o ui.py -x

ui.py 看起来像这样:

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

# Form implementation generated from reading ui file 'gui.ui'
#
# Created: Wed Apr 20 14:00:02 2016
# by: pyside-uic 0.2.15 running on PySide 1.2.2
#
# WARNING! All changes made in this file will be lost!

from PySide import QtCore, QtGui

class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(444, 530)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.mplvl = MyStaticMplCanvas(self.centralwidget)
self.mplvl.setGeometry(QtCore.QRect(120, 190, 221, 161))
self.mplvl.setObjectName("mplvl")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 444, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))

from mystaticmplcanvas import MyStaticMplCanvas

if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())

现在如何从单独的 .py 文件向 mplvl 对象添加绘图?

最佳答案

我不是这方面的专家,所以这可能不是最简洁的方法,但这里有一些工作代码可以帮助您入门:

  • 我认为添加小部件的最简单方法是通过 QxxxxLayout
  • 然后我让你的 Plotter 继承自 FigureCanvas
  • 并告诉 matplotlibPySide 一起工作

ui.py:

from PySide import QtCore, QtGui

class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(533, 497)
self.mplvl = QtGui.QWidget(Form)
self.mplvl.setGeometry(QtCore.QRect(150, 150, 251, 231))
self.mplvl.setObjectName("mplvl")
self.vLayout = QtGui.QVBoxLayout()
self.mplvl.setLayout(self.vLayout)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)

def retranslateUi(self, Form):
Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))

为此,您只需将 Canvas 添加到 QtDesigner 中的 mplvl

主要.py:

import matplotlib
matplotlib.use('Qt4Agg')
matplotlib.rcParams['backend.qt4'] = 'PySide'
from matplotlib.backends.backend_qt4agg import (
FigureCanvasQTAgg as FigureCanvas,
NavigationToolbar2QT as NavigationToolbar)
from matplotlib.figure import Figure
from PySide import QtGui, QtCore
import random

from weakref import proxy
from ui import Ui_Form


class Plotter(FigureCanvas):
def __init__(self, parent):
''' plot some random stuff '''
self.parent = proxy(parent)
# random data
data = [random.random() for i in range(10)]
fig = Figure()
super(Plotter,self).__init__(fig)
# create an axis
self.axes = fig.add_subplot(111)
# discards the old graph
self.axes.hold(False)
# plot data
self.axes.plot(data, '*-')

def binding_plotter_with_ui(self):
self.parent.vLayout.insertWidget(1, self)

if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Form = QtGui.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
# plotter logic and binding needs to be added here
plotter = Plotter(ui)
plotter.binding_plotter_with_ui()
plotter2 = Plotter(ui)
plotter2.binding_plotter_with_ui()
Form.show()
sys.exit(app.exec_())

现在剩下的可能是调整 FigureCanvas 以使其具有正确的大小和比例,因此您应该能够获得想要的内容 this examplethe other .

祝你好运!

关于python - Pyside 中的 Matplotlib 与 Qt 设计器 (PySide),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36464357/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com