Python 使用PyQt5检查QCheckBox时显示matplotlib绘图
我想使用PyQt5制作一个Gui并显示matplotlib绘图。Python 使用PyQt5检查QCheckBox时显示matplotlib绘图,python,matplotlib,pyqt5,Python,Matplotlib,Pyqt5,我想使用PyQt5制作一个Gui并显示matplotlib绘图。 这是主窗口的图片: 问题是,当选中QCheckBox时,是否有任何方法显示绘图? 我插入了4个复选框,每个复选框都有不同的绘图或不同的选项。 例如,其中两个将显示两个不同的图,其中两个将轴更改为对数坐标。 我知道工具栏中有一个选项可以执行此操作,但我希望通过单击复选框立即执行这些更改。 我发现使用PyQt4,但它使用QpushButton进行更改。我渴望立即改变。 和matplotlib的小部件,不适合我的Gui。 有什么建议吗
这是主窗口的图片:
问题是,当选中QCheckBox时,是否有任何方法显示绘图? 我插入了4个复选框,每个复选框都有不同的绘图或不同的选项。 例如,其中两个将显示两个不同的图,其中两个将轴更改为对数坐标。
我知道工具栏中有一个选项可以执行此操作,但我希望通过单击复选框立即执行这些更改。
我发现使用PyQt4,但它使用QpushButton进行更改。我渴望立即改变。
和matplotlib的小部件,不适合我的Gui。
有什么建议吗 下面是qt设计器中的代码和代码。也许有些代码已经足够了,因为我尝试了很多东西。 x和y的两个样本列表
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUiType
import sys
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib
matplotlib.use('Qt5Agg')
ui, _ = loadUiType('plots.ui')
class MplCanvas(FigureCanvasQTAgg):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
super(MplCanvas, self).__init__(fig)
class MainWindow(QMainWindow, ui):
def __init__(self, *args, **kwargs):
QMainWindow.__init__(self)
self.setupUi(self)
self.checkBox_1.stateChanged.connect(self.checker)
self.checkBox_2.stateChanged.connect(self.checker)
toolbar = NavigationToolbar(sc, self)
self.verticalLayout.addWidget(toolbar)
self.verticalLayout.addWidget(sc)
def checker(self):
x = [1,2,3,4,5]
y = [1,2,3,4,5]
if self.checkBox_1.isChecked():
sc = MplCanvas(self, width=5, height=4, dpi=100)
sc.axes.plot(x, y)
self.show()
if self.checkBox_2.isChecked():
sc = MplCanvas(self, width=5, height=4, dpi=100)
sc.axes.plot(x, y)
self.show()
def main():
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
if __name__ == '__main__':
main()
在努力研究这个问题之后,我终于找到了解决办法。但可能代码太多了,我仍然可以从其他人那里得到建议。
以下是我尝试过的:
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import *
from PyQt5.uic import loadUiType
import sys
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg, NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
import matplotlib
matplotlib.use('Qt5Agg')
ui, _ = loadUiType('plots.ui')
class MplCanvas(FigureCanvasQTAgg):
def __init__(self, parent=None, width=5, height=4, dpi=100):
fig = Figure(figsize=(width, height), dpi=dpi)
self.axes = fig.add_subplot(111)
super(MplCanvas, self).__init__(fig)
class MainWindow(QMainWindow, ui):
def __init__(self, *args, **kwargs):
QMainWindow.__init__(self)
self.setupUi(self)
self.checkBox_1.stateChanged.connect(self.raw)
self.checkBox_2.stateChanged.connect(self.raw)
def raw(self):
for i in range(self.verticalLayout.count()): self.verticalLayout.itemAt(i).widget().close()
x = [1,2,3,4,5]
y = [6,8,2,7,3]
sc = MplCanvas(self, width=5, height=4, dpi=100)
toolbar = NavigationToolbar(sc, self)
self.verticalLayout.addWidget(toolbar)
self.verticalLayout.addWidget(sc)
if self.checkBox_1.isChecked() and not self.checkBox_2.isChecked():
sc.axes.plot(x, y)
if self.checkBox_2.isChecked() and not self.checkBox_1.isChecked():
sc.axes.plot(y, x)
elif self.checkBox_2.isChecked() and self.checkBox_1.isChecked():
sc.axes.plot(x, y, 'r', y, x, 'b')
self.show()
def main():
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
if __name__ == '__main__':
main()
正如您在这段代码中所看到的,每当复选框在其状态下更改时,我都会尝试清除布局,并为绘图使用if语句。
我知道这样做有更好的方法,所以我可以利用你的宝贵建议。
请提供@eyllanesc添加的代码self.plots.extend(sc.axes.plot(x,y));对于self.plots中的plot:plot.remove()
这不能工作吗?