В следующем минимальном примере GUI у меня есть кнопка и окно графика, содержащее 2 строки. Когда пользователь нажимает кнопку, я хочу изменить ширину линии обеих линий, после чего график должен быть перерисован.
Когда я нажимаю кнопку, я получаю ошибку TypeError для команды draw()
:
Traceback (most recent call last):
File "minimal_plot.py", line 55, in updatePlot
self.sc.ax.draw()
TypeError: draw_wrapper() missing 1 required positional argument: 'renderer'
Мне никогда не приходилось передавать аргументы draw()
раньше. Что мне там поставить?
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.Qt import *
import matplotlib
matplotlib.use('Qt5Agg')
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
class MplCanvas(FigureCanvasQTAgg):
def __init__(self, parent=None):
fig = Figure(figsize=(10, 10), dpi=100)
self.ax = fig.add_subplot(111)
super(MplCanvas, self).__init__(fig)
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
# --- Define layout ---
layout1 = QVBoxLayout()
btn = QPushButton('', self)
btn.clicked.connect(self.updatePlot)
layout1.addWidget(btn)
# Plot section
self.sc = MplCanvas(self)
layout1.addWidget(self.sc)
self.sc.setFixedHeight(600)
self.sc.setFixedWidth(600)
self.show()
widget = QWidget()
widget.setLayout(layout1)
self.setCentralWidget(widget)
# Create some lines
self.sc.ax.plot([0,1,2,3,4], [10,1,20,3,40])
self.sc.ax.plot([0,1,2,3,4], [9,0,19,2,39])
def updatePlot(self):
lines = self.sc.ax.get_lines()
for i in range(len(lines)):
lines[i].set_linewidth(4)
self.sc.ax.draw()
# Fix to make PyQt5 close correctly in Spyder
def closeEvent(self,event):
QApplication.quit()
# Run main code
app = QApplication.instance()
window = MainWindow()
window.show()
app.exec_()
Примечание: код может немного отличаться от обычного приложения PyQt5, потому что я запускаю его в Spyder (поэтому я вызываю app = Qapplication.instance()
вместо app = Qapplication([])
. Определение closeEvent()
также можно удалить, если не использовать Spyder.