Как сделать настраиваемые диапазоны у графика?

Как можно реализовать настройку диапазона по оси X задавая ограничения через QPlainTextEdit?

main.py:

import sys
import random

from PyQt5 import QtCore, QtGui, QtWidgets

from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar  # +++
from matplotlib.figure import Figure
from Ui_unt import Ui_MainWindow


class MplCanvas(FigureCanvas):
    def __init__(self, *args, **kwargs):
        self.fig = Figure()
        super(MplCanvas, self).__init__(self.fig, *args, **kwargs)

    def plot(self, x, y):
        self.fig.clear()
        self.ax = self.fig.add_subplot(111)
        self.ax.plot(x, y)
       # self.ax.set_xlim(xmin=0)
       # self.ax.set_xlim(xmax=100)
        self.ax.grid(True)

        self.draw()

    def _clear(self):
        self.fig.clear()
        self.draw()


class TEST(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(TEST, self).__init__()
        self.setupUi(self)

        self.pushButton.clicked.connect(self._plot)
        self.pushButton_2.clicked.connect(self.button_clear)

        self.canavas = MplCanvas()
        self.canavas.setMinimumSize(300, 300)
        self.toolbar = NavigationToolbar(self.canavas, self)

        self.verticalLayout.addWidget(self.canavas)
        self.verticalLayout.addWidget(self.toolbar)
        self.toolbar.hide()

    def _plot(self):
        x = [random.randrange(1, 100) for _ in range(10)]
        y = [random.randrange(1, 100) for _ in range(10)]
        self.canavas.plot(x, y)
        self.toolbar.show()
        self.plainTextEdit.toPlainText()
        self.plainTextEdit_2.toPlainText()

    def button_clear(self):
        self.canavas._clear()
        

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ui = TEST()
    ui.show()
    sys.exit(app.exec_())

Ui_unt.py:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(249, 332)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout.addWidget(self.pushButton_2)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.horizontalLayout.addWidget(self.plainTextEdit)
        self.plainTextEdit_2 = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.plainTextEdit_2.setObjectName("plainTextEdit_2")
        self.horizontalLayout.addWidget(self.plainTextEdit_2)
        self.verticalLayout.addLayout(self.horizontalLayout)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 249, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_2.setText(_translate("MainWindow", "PushButton"))
        self.plainTextEdit.setPlainText(_translate("MainWindow", "0"))
        self.plainTextEdit_2.setPlainText(_translate("MainWindow", "100"))

Ответы (1 шт):

Автор решения: S. Nick

Обратите внимание, что для этих целей, правильно использовать виджет QSpinBox, который предоставляет виджет счетчика.

import sys
import random

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar  # +++
from matplotlib.figure import Figure


#from Ui_unt import Ui_MainWindow
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(249, 332)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout.addWidget(self.pushButton_2)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        '''
        self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.horizontalLayout.addWidget(self.plainTextEdit)
        '''
# !!! +++ 
        self.spinbox = QtWidgets.QSpinBox(self.centralwidget)
        self.spinbox.setObjectName("spinbox")
        self.horizontalLayout.addWidget(self.spinbox)

        '''        
        self.plainTextEdit_2 = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.plainTextEdit_2.setObjectName("plainTextEdit_2")
        self.horizontalLayout.addWidget(self.plainTextEdit_2)
        '''
# !!! +++ 
        self.spinbox_2 = QtWidgets.QSpinBox(self.centralwidget)
        self.spinbox_2.setObjectName("spinbox_2")
        self.horizontalLayout.addWidget(self.spinbox_2)
        
        self.verticalLayout.addLayout(self.horizontalLayout)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 249, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))
        self.pushButton_2.setText(_translate("MainWindow", "PushButton"))
        
#        self.plainTextEdit.setPlainText(_translate("MainWindow", "0"))
#        self.plainTextEdit_2.setPlainText(_translate("MainWindow", "100"))
        

class MplCanvas(FigureCanvas):
    def __init__(self, *args, **kwargs):
        self.fig = Figure()
        super(MplCanvas, self).__init__(self.fig, *args, **kwargs)

    def plot(self, x, y):
        self.fig.clear()
        self.ax = self.fig.add_subplot(111)
        self.ax.plot(x, y)
       # self.ax.set_xlim(xmin=0)
       # self.ax.set_xlim(xmax=100)
        self.ax.grid(True)

        self.draw()

    def _clear(self):
        self.fig.clear()
        self.draw()


class TEST(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(TEST, self).__init__()
        self.setupUi(self)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
        self.spinbox.setRange(0, 10)
        self.spinbox.setValue(5)
        self.spinbox_2.setRange(20, 120)
        self.spinbox_2.setValue(77)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        self.pushButton.clicked.connect(self._plot)
        self.pushButton_2.clicked.connect(self.button_clear)

        self.canavas = MplCanvas()
        self.canavas.setMinimumSize(300, 300)
        self.toolbar = NavigationToolbar(self.canavas, self)

        self.verticalLayout.addWidget(self.canavas)
        self.verticalLayout.addWidget(self.toolbar)
        self.toolbar.hide()

    def _plot(self):
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
        minimum = self.spinbox.value()
        maximum = self.spinbox_2.value()

#        x = [random.randrange(1, 100) for _ in range(10)]
        x = [random.randrange(minimum, maximum) for _ in range(10)]
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        
        y = [random.randrange(1, 100) for _ in range(10)]
        self.canavas.plot(x, y)
        self.toolbar.show()
        
#        self.plainTextEdit.toPlainText()
#        self.plainTextEdit_2.toPlainText()

    def button_clear(self):
        self.canavas._clear()
        

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ui = TEST()
    ui.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка