gpt4 book ai didi

python - pyqt5 应用程序中的 matplotlib 工具栏

转载 作者:太空宇宙 更新时间:2023-11-03 13:30:19 28 4
gpt4 key购买 nike

这是一个使用 python 和 qt 完成的非常简单的应用程序,其中有一个嵌入式 matplotlib 图。我想在绘图上包含标准工具栏(缩放、主页等)。可能吗?上面有一个代码示例。

import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePolicy, QMessageBox, QWidget, QPushButton, QAction, QLineEdit, QLabel
from PyQt5.QtGui import QIcon
from PyQt5 import QtWidgets
from PyQt5.QtCore import QSize

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import random

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar


class MainWindow(QMainWindow):
def __init__(self):

QMainWindow.__init__(self)

self.title = 'test'
self.left = 10
self.top = 10
self.width = 1920
self.height = 1080

self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)

m = PlotCanvas(self, width=10, height=8)
m.move(0,100)

self.statusBar().showMessage('Ready')

mainMenu = self.menuBar()
mainMenu.setNativeMenuBar(False)
fileMenu = mainMenu.addMenu('File')
helpMenu = mainMenu.addMenu('Help')

exitButton = QAction(QIcon('exit24.png'), 'Exit', self)
exitButton.setShortcut('Ctrl+Q')
exitButton.setStatusTip('Exit application')
exitButton.triggered.connect(self.close)
fileMenu.addAction(exitButton)


self.nameLabel = QLabel(self)
self.nameLabel.setText('Name:')
self.line = QLineEdit(self)

self.nameLabel2 = QLabel(self)
self.nameLabel2.setText('Result')
#self.line2 = QLineEdit(self)

self.line.move(80, 20)
self.line.resize(200, 32)
self.nameLabel.move(20, 20)

#self.line2.move(500, 20)
#self.line2.resize(500, 32)
self.nameLabel2.move(500, 20)

pybutton = QPushButton('Click me', self)
pybutton.clicked.connect(self.clickMethod)
pybutton.resize(100,32)
pybutton.move(50, 50)

def clickMethod(self):
print('Clicked Pyqt button.')
if((self.line.text() == '')):
self.statusBar().showMessage('Not a Number')
else:
print('Number: ' + str(float(self.line.text())*2))
self.statusBar().showMessage('Introduction of a number')
self.nameLabel2.setText(str(float(self.line.text())*2))


class PlotCanvas(FigureCanvas):

def __init__(self, parent=None, width=10, height=8, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)

FigureCanvas.__init__(self, fig)
self.setParent(parent)
#self.addWidget(toolbar)


FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
self.plot()

def plot(self):
data = [random.random() for i in range(250)]
ax = self.figure.add_subplot(111)
ax.plot(data, 'r-', linewidth = 0.5)
ax.set_title('PyQt Matplotlib Example')
self.draw()

if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit( app.exec_())

代码有一个按钮、一个状态栏、一个 matplotlib 图和一个 QlineEdit。

最佳答案

要创建一个 NavigationToolbar,您必须传递 Canvas 和父级,但由于它们将在一起,因此建议创建一个小部件,如下所示:

class WidgetPlot(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
self.setLayout(QVBoxLayout())
self.canvas = PlotCanvas(self, width=10, height=8)
self.toolbar = NavigationToolbar(self.canvas, self)
self.layout().addWidget(self.toolbar)
self.layout().addWidget(self.canvas)

然后我会将 m = PlotCanvas(self, width = 10, height = 8) 更改为 m = WidgetPlot(self),这将解决您的问题。

加上:

为了获得适当的顺序,建议使用布局,在下面的代码中我展示了与布局相同的代码:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QAction, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QSpacerItem, QSizePolicy, QPushButton
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import QSize

from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import random

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar


class MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)

self.title = 'test'
self.left = 10
self.top = 10
self.width = 1920
self.height = 1080

self.setWindowTitle(self.title)
self.setGeometry(self.left, self.top, self.width, self.height)

self.statusBar().showMessage('Ready')

mainMenu = self.menuBar()
mainMenu.setNativeMenuBar(False)
fileMenu = mainMenu.addMenu('File')
helpMenu = mainMenu.addMenu('Help')

exitButton = QAction(QIcon('exit24.png'), 'Exit', self)
exitButton.setShortcut('Ctrl+Q')
exitButton.setStatusTip('Exit application')
exitButton.triggered.connect(self.close)
fileMenu.addAction(exitButton)


widget = QWidget(self)
self.setCentralWidget(widget)
vlay = QVBoxLayout(widget)
hlay = QHBoxLayout()
vlay.addLayout(hlay)

self.nameLabel = QLabel('Name:', self)
self.line = QLineEdit(self)
self.nameLabel2 = QLabel('Result', self)

hlay.addWidget(self.nameLabel)
hlay.addWidget(self.line)
hlay.addWidget(self.nameLabel2)
hlay.addItem(QSpacerItem(1000, 10, QSizePolicy.Expanding))

pybutton = QPushButton('Click me', self)
pybutton.clicked.connect(self.clickMethod)
hlay2 = QHBoxLayout()
hlay2.addWidget(pybutton)
hlay2.addItem(QSpacerItem(1000, 10, QSizePolicy.Expanding))
vlay.addLayout(hlay2)
m = WidgetPlot(self)
vlay.addWidget(m)

def clickMethod(self):
print('Clicked Pyqt button.')
if self.line.text() == '':
self.statusBar().showMessage('Not a Number')
else:
print('Number: {}'.format(float(self.line.text())*2))
self.statusBar().showMessage('Introduction of a number')
self.nameLabel2.setText(str(float(self.line.text())*2))

class WidgetPlot(QWidget):
def __init__(self, *args, **kwargs):
QWidget.__init__(self, *args, **kwargs)
self.setLayout(QVBoxLayout())
self.canvas = PlotCanvas(self, width=10, height=8)
self.toolbar = NavigationToolbar(self.canvas, self)
self.layout().addWidget(self.toolbar)
self.layout().addWidget(self.canvas)

class PlotCanvas(FigureCanvas):
def __init__(self, parent=None, width=10, height=8, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
FigureCanvas.__init__(self, fig)
self.setParent(parent)
FigureCanvas.setSizePolicy(self, QSizePolicy.Expanding, QSizePolicy.Expanding)
FigureCanvas.updateGeometry(self)
self.plot()

def plot(self):
data = [random.random() for i in range(250)]
ax = self.figure.add_subplot(111)
ax.plot(data, 'r-', linewidth = 0.5)
ax.set_title('PyQt Matplotlib Example')
self.draw()

if __name__ == "__main__":
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit( app.exec_())

输出:

enter image description here

关于python - pyqt5 应用程序中的 matplotlib 工具栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48140576/

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