Не могу разобраться с обработками сигналов и событий в pyqt
Не могу понять, как по кнопке делать то или иное событие (кроме print)? Сначала была проблема с отображением web окна по кнопке, в этом мне помог уважаемый S.Nick. Теперь не могу по кнопке сделать так, чтобы выбранные мной параметры были переданы в функцию из другого модуля. Я пытался сделать как с веб окном, но у меня не выходит. Как это сделать? Код прилагается:
import sys
import serial
import minimalmodbus
from icecream import ic
import plotly.offline as po
import plotly.graph_objs as go
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWebEngineWidgets import QWebEngineView
class Widget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("График температур")
screen = app.primaryScreen()
size = screen.size()
self.resize(size.width() / 4, size.height() / 4)
self.browser = None
self.com_ports = QtWidgets.QComboBox()
self.slave = 1
self.baudrate = 115200
self.bytesize = 8
self.parity = serial.PARITY_NONE
self.stopbits = 1
self.timeout = 0.05
self.mode = minimalmodbus.MODE_RTU
text_com_ports = QtWidgets.QLabel("Com-порт")
text_addr_slave = QtWidgets.QLabel("Адресс устройства")
text_addr_regs = QtWidgets.QLabel("Регистр")
text_baudrate = QtWidgets.QLabel("Скорость")
text_bytesize = QtWidgets.QLabel("Размер бита")
text_parity = QtWidgets.QLabel("Паритет")
text_timeout = QtWidgets.QLabel("Тайм-аут")
text_mode = QtWidgets.QLabel("Режим")
btn_connect = QtWidgets.QPushButton("Подключиться")
btn_connect.clicked.connect(self.f_modbus)
btn_trend = QtWidgets.QPushButton("Открыть график")
btn_trend.clicked.connect(self.on_clicked_trend)
self.com_ports = QtWidgets.QComboBox()
self.com_ports.addItems([str(i) for i in range(1, 21)])
self.addr_slave = QtWidgets.QSpinBox(maximum=256)
self.addr_regs = QtWidgets.QSpinBox(maximum=256)
self.baudrate = QtWidgets.QComboBox()
self.baudrate.addItems(['1200', '2400', '4800', '9600', '1440', '19200', '38400', '57600', '115200'])
self.bytesize = QtWidgets.QComboBox()
self.bytesize.addItems(['7', '8'])
self.parity = QtWidgets.QComboBox()
self.parity.addItems(['нет, чётный, нечётный'])
self.timeout = QtWidgets.QComboBox()
self.timeout.addItems(['12','23'])
self.mode = QtWidgets.QComboBox()
self.mode.addItems(['rtu', 'ascii'])
grid = QtWidgets.QGridLayout(self)
grid.addWidget(text_com_ports, 0, 0)
grid.addWidget(self.com_ports, 0, 1)
grid.addWidget(text_addr_slave, 1, 0)
grid.addWidget(self.addr_slave, 1, 1)
grid.addWidget(text_addr_regs, 2, 0)
grid.addWidget(self.addr_regs, 2, 1)
grid.addWidget(btn_connect, 4, 0)
grid.addWidget(btn_trend, 4, 1)
grid.addWidget(text_baudrate, 3, 0)
grid.addWidget(self.baudrate, 3, 1)
grid.addWidget(text_bytesize, 0, 2)
grid.addWidget(self.bytesize, 0, 3)
grid.addWidget(text_parity, 1, 2)
grid.addWidget(self.parity, 1, 3)
grid.addWidget(text_timeout, 2, 2)
grid.addWidget(self.timeout, 2, 3)
grid.addWidget(text_mode, 3, 2)
grid.addWidget(self.mode, 3, 3)
ic(str(self.com_ports.currentIndex()))
ic(self.addr_slave.value())
ic(self.addr_regs.value())
@QtCore.pyqtSlot()
def f_modbus(self):
modbus = minimalmodbus.Instrument('COM' + str(self.com_ports.currentIndex()), self.addr_slave.value())
modbus.serial.baudrate = self.baudrate
modbus.serial.bytesize = self.bytesize
modbus.serial.parity = serial.PARITY_NONE
modbus.serial.stopbits = self.stopbits
modbus.serial.timeout = self.timeout
modbus.mode = minimalmodbus.MODE_RTU
modbus.read_register(self.addr_regs.value())
@QtCore.pyqtSlot()
def start_web(self, fig):
raw_html = '<html><head><meta charset="utf-8" />'
raw_html += '<script src="https://cdn.plot.ly/plotly-latest.min.js"></script></head>'
raw_html += '<body>'
raw_html += po.plot(fig, include_plotlyjs=False, output_type='div')
raw_html += '</body></html>'
return raw_html
@QtCore.pyqtSlot()
def on_clicked_trend(self):
ic(str(self.com_ports.currentIndex()))
ic(self.addr_slave.value())
ic(self.addr_regs.value())
self.browser = QWebEngineView()
fig = go.Figure(data=[{'type': 'scattergl', 'y': [2, 1, 3, 1, 10]}])
fig_view = self.start_web(fig)
self.browser.setHtml(fig_view)
self.browser.show()
def closeEvent(self, event):
if self.browser:
self.browser.hide()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
view = Widget()
view.show()
sys.exit(app.exec_())