class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) # 状态栏配置 self.status_label = QtWidgets.QLabel() self.status_label.setText("Hello word!") self.statusbar.addWidget(self.status_label) # 串口配置 self.comboBox = MyCombox(self.centralwidget) x = 670 + 97 y = 20 + 10 self.comboBox.setGeometry(QtCore.QRect(x, y, 115, 33)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.comboBox.sizePolicy().hasHeightForWidth()) self.comboBox.setSizePolicy(sizePolicy) self.comboBox.setMinimumSize(QtCore.QSize(0, 30)) self.comboBox.setObjectName("comboBox") self.comboBox.enter_event_signal.connect(self.onCombox_EnterSlot) self.serial_port = SerialPort() self.serial_port.searchPort() self.serial_list = list(self.serial_port.port.keys()) self.serial_list.sort() for item in self.serial_list: self.comboBox.addItem(item) self.comboBox_baudrate.addItem('1200') self.comboBox_baudrate.addItem('2400') self.comboBox_baudrate.addItem('4800') self.comboBox_baudrate.addItem('9600') self.comboBox_baudrate.addItem('19200') self.comboBox_baudrate.addItem('38400') self.comboBox_baudrate.addItem('57600') self.comboBox_baudrate.addItem('115200') self.comboBox_baudrate.setCurrentIndex(7) self.serial_port.baund_rate = QSerialPort.Baud115200 self.comboBox_baudrate.currentIndexChanged.connect( self.onCombox_baudrate_IncdeChangeSlot) self.comboBox_stopBit.addItem('1') self.comboBox_stopBit.addItem('1.5') self.comboBox_stopBit.addItem('2') self.comboBox_stopBit.setCurrentIndex(0) self.comboBox_stopBit.currentIndexChanged.connect( self.onCombox_stopBit_IncdeChangeSlot) self.comboBox_dataBit.addItem('5') self.comboBox_dataBit.addItem('6') self.comboBox_dataBit.addItem('7') self.comboBox_dataBit.addItem('8') self.comboBox_dataBit.setCurrentIndex(3) self.comboBox_dataBit.currentIndexChanged.connect( self.onCombox_dataBit_IncdeChangeSlot) self.comboBox_parity.addItem('无') self.comboBox_parity.addItem('奇校验') self.comboBox_parity.addItem('偶校验') self.comboBox_parity.setCurrentIndex(0) self.comboBox_parity.currentIndexChanged.connect( self.onCombox_parity_IncdeChangeSlot) # 摄像头显示进程配置 self.thread_camera = ThreadCamera() # 创建定时器,用于定时读取摄像头进程中的图像 self.timer = QTimer(self) self.timer.setInterval(16) self.timer.timeout.connect(self.slotTimerTimeout) # 开关按钮配置 self.pushButton_flag = True self.pushButton_switch.clicked.connect(self.onPushButton_ClickedSlot) # 串口号选择 def onCombox_EnterSlot(self): if self.pushButton_flag: index = self.comboBox.currentIndex() text = self.comboBox.currentText() self.comboBox.clear() self.serial_port.searchPort() self.serial_list = list(self.serial_port.port.keys()) self.serial_list.sort() for item in self.serial_list: self.comboBox.addItem(item) self.comboBox.setCurrentIndex(index) if self.comboBox.currentText() != text: self.comboBox.setCurrentIndex(0) # 串口波特率选择 def onCombox_baudrate_IncdeChangeSlot(self): current_index = self.comboBox_baudrate.currentIndex() if current_index == 0: self.serial_port.baund_rate = QSerialPort.Baud1200 elif current_index == 1: self.serial_port.baund_rate = QSerialPort.Baud2400 elif current_index == 2: self.serial_port.baund_rate = QSerialPort.Baud4800 elif current_index == 3: self.serial_port.baund_rate = QSerialPort.Baud9600 elif current_index == 4: self.serial_port.baund_rate = QSerialPort.Baud19200 elif current_index == 5: self.serial_port.baund_rate = QSerialPort.Baud38400 elif current_index == 6: self.serial_port.baund_rate = QSerialPort.Baud57600 elif current_index == 7: self.serial_port.baund_rate = QSerialPort.Baud115200 # 串口停止位选择 def onCombox_stopBit_IncdeChangeSlot(self): current_index = self.comboBox_stopBit.currentIndex() if current_index == 0: self.serial_port.stop_bits = QSerialPort.OneStop elif current_index == 1: self.serial_port.stop_bits = QSerialPort.OneAndHalfStop elif current_index == 2: self.serial_port.stop_bits = QSerialPort.TwoStop # 串口数据位选择 def onCombox_dataBit_IncdeChangeSlot(self): current_index = self.comboBox_dataBit.currentIndex() if current_index == 0: self.serial_port.data_bits = QSerialPort.Data5 elif current_index == 1: self.serial_port.data_bits = QSerialPort.Data6 elif current_index == 2: self.serial_port.data_bits = QSerialPort.Data7 elif current_index == 3: self.serial_port.data_bits = QSerialPort.Data8 # 串口奇偶校验位选择 def onCombox_parity_IncdeChangeSlot(self): current_index = self.comboBox_parity.currentIndex() if current_index == 0: self.serial_port.parity = QSerialPort.NoParity elif current_index == 1: self.serial_port.parity = QSerialPort.OddParity elif current_index == 2: self.serial_port.parity = QSerialPort.EvenParity # 定时器到达时间间隔的槽函数 def slotTimerTimeout(self): if self.thread_camera.img_frame and (not self.thread_camera.end_flag): self.label_video.setPixmap( QPixmap.fromImage(self.thread_camera.img_frame)) else: self.label_video.clear() # 按钮按下动作 def onPushButton_ClickedSlot(self): if self.pushButton_flag: port_name = self.comboBox.currentText() if port_name != '': self.serial_port.setPort(self.serial_port.port[port_name]) self.serial_port.open(QSerialPort.ReadWrite) self.serial_port.setBaudRate(self.serial_port.baund_rate) self.serial_port.setStopBits(self.serial_port.stop_bits) self.serial_port.setDataBits(self.serial_port.data_bits) self.serial_port.setParity(self.serial_port.parity) self.pushButton_flag = False self.pushButton_switch.setStyleSheet( "border-image: url(:/on/on.png);") self.comboBox.setEnabled(False) self.comboBox_baudrate.setEnabled(False) self.comboBox_stopBit.setEnabled(False) self.comboBox_dataBit.setEnabled(False) self.comboBox_parity.setEnabled(False) self.thread_camera.end_flag = False self.thread_camera.start() self.timer.start() self.lineEdit_ip.setReadOnly(True) self.lineEdit_telephone.setReadOnly(True) else: QMessageBox.warning(None, "Warning!", "Cannot detect serial!") else: self.serial_port.close() self.pushButton_flag = True self.pushButton_switch.setStyleSheet( "border-image: url(:/off/off.png);") self.comboBox.setEnabled(True) self.comboBox_baudrate.setEnabled(True) self.comboBox_stopBit.setEnabled(True) self.comboBox_dataBit.setEnabled(True) self.comboBox_parity.setEnabled(True) self.timer.stop() self.thread_camera.end_flag = True self.label_video.clear() self.lineEdit_ip.setReadOnly(False) self.lineEdit_telephone.setReadOnly(False)
class MainWindow(QMainWindow, Ui_MainWindow): serial_readyWrite_signal = QtCore.pyqtSignal(str, bytes, str) serial_readyRead_signal = QtCore.pyqtSignal(bool) def __init__(self): super().__init__() self.setupUi(self) self.comboBox = MyCombox(self.centralwidget) self.comboBox.setGeometry(QtCore.QRect(750, 40, 193, 30)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.comboBox.sizePolicy().hasHeightForWidth()) self.comboBox.setSizePolicy(sizePolicy) self.comboBox.setMinimumSize(QtCore.QSize(0, 30)) self.comboBox.setObjectName("comboBox") self.comboBox.enter_event_signal.connect(self.onComboxEnterSlot) self.serial_port = SerialPort() self.serial_port.searchPort() self.serial_list = list(self.serial_port.port.keys()) self.serial_list.sort() for item in self.serial_list: self.comboBox.addItem(item) self.comboBox_2.addItem('1200') self.comboBox_2.addItem('2400') self.comboBox_2.addItem('4800') self.comboBox_2.addItem('9600') self.comboBox_2.addItem('19200') self.comboBox_2.addItem('38400') self.comboBox_2.addItem('57600') self.comboBox_2.addItem('115200') self.comboBox_2.setCurrentIndex(3) self.comboBox_2.currentIndexChanged.connect( self.onCombox_2IncdeChangeSlot) self.comboBox_3.addItem('1') self.comboBox_3.addItem('1.5') self.comboBox_3.addItem('2') self.comboBox_3.setCurrentIndex(0) self.comboBox_3.currentIndexChanged.connect( self.onCombox_3IncdeChangeSlot) self.comboBox_4.addItem('5') self.comboBox_4.addItem('6') self.comboBox_4.addItem('7') self.comboBox_4.addItem('8') self.comboBox_4.setCurrentIndex(3) self.comboBox_4.currentIndexChanged.connect( self.onCombox_4IncdeChangeSlot) self.comboBox_5.addItem('无') self.comboBox_5.addItem('奇校验') self.comboBox_5.addItem('偶校验') self.comboBox_5.setCurrentIndex(0) self.comboBox_5.currentIndexChanged.connect( self.onCombox_5IncdeChangeSlot) self.pushButton_flag = True self.pushButton.clicked.connect(self.onPushButtonClickedSlot) self.pushButton_2.clicked.connect(self.onPushButton_2ClickedSlot) self.pushButton_3.clicked.connect(self.onPushButton_3ClickedSlot) self.pushButton_4.clicked.connect(self.onPushButton_4ClickedSlot) self.pushButton_5.clicked.connect(self.onPushButton_5ClickedSlot) self.write_encodemode = 'utf-8' self.radioButton.toggled.connect(self.onRadioButtonToggledSlot) self.radioButton_2.toggled.connect(self.onRadioButton_2ToggledSlot) self.radioButton_3.toggled.connect(self.onRadioButton_3ToggledSlot) self.radioButton_4.toggled.connect(self.onRadioButton_4ToggledSlot) self.radioButton_5.toggled.connect(self.onRadioButton_5ToggledSlot) self.radioButton_6.toggled.connect(self.onRadioButton_6ToggledSlot) self.serial_write_thread = QtCore.QThread() self.serial_write_threadObject = SerialWriteThreadObject( self.serial_port) self.serial_write_threadObject.moveToThread(self.serial_write_thread) self.serial_write_threadObject.write_finished.connect( self.serialWriteThreadFinishedSlot) self.serial_readyWrite_signal.connect( self.serial_write_threadObject.serialWriteSlot) self.serial_write_thread.start() self.serial_read_thread = QtCore.QThread() self.serial_read_threadObject = SerialReadThreadObject( self.serial_port) self.serial_read_threadObject.moveToThread(self.serial_read_thread) self.serial_port.readyRead.connect(self.serialReadyReadSlot) self.serial_readyRead_signal.connect( self.serial_read_threadObject.serialReadSlot) self.serial_read_threadObject.read_finished.connect( self.serialReadThreadFinishedSlot) self.serial_read_thread.start() self.receive_color = QtGui.QColor(220, 20, 60) self.send_color = QtGui.QColor(153, 50, 204) self.textBrowser_text_list = [] self.textBrowser_addTime_flag = False self.textBrowser_hex_flag = False self.write_newLine_flag = False self.write_hex_flag = False self.textEdit_textNum = 0 def onComboxEnterSlot(self): if self.pushButton_flag: index = self.comboBox.currentIndex() text = self.comboBox.currentText() self.comboBox.clear() self.serial_port.searchPort() self.serial_list = list(self.serial_port.port.keys()) self.serial_list.sort() for item in self.serial_list: self.comboBox.addItem(item) self.comboBox.setCurrentIndex(index) if self.comboBox.currentText() != text: self.comboBox.setCurrentIndex(0) def onCombox_2IncdeChangeSlot(self): current_index = self.comboBox_2.currentIndex() if current_index == 0: self.serial_port.baund_rate = QSerialPort.Baud1200 elif current_index == 1: self.serial_port.baund_rate = QSerialPort.Baud2400 elif current_index == 2: self.serial_port.baund_rate = QSerialPort.Baud4800 elif current_index == 3: self.serial_port.baund_rate = QSerialPort.Baud9600 elif current_index == 4: self.serial_port.baund_rate = QSerialPort.Baud19200 elif current_index == 5: self.serial_port.baund_rate = QSerialPort.Baud38400 elif current_index == 6: self.serial_port.baund_rate = QSerialPort.Baud57600 elif current_index == 7: self.serial_port.baund_rate = QSerialPort.Baud115200 def onCombox_3IncdeChangeSlot(self): current_index = self.comboBox_3.currentIndex() if current_index == 0: self.serial_port.stop_bits = QSerialPort.OneStop elif current_index == 1: self.serial_port.stop_bits = QSerialPort.OneAndHalfStop elif current_index == 2: self.serial_port.stop_bits = QSerialPort.TwoStop def onCombox_4IncdeChangeSlot(self): current_index = self.comboBox_4.currentIndex() if current_index == 0: self.serial_port.data_bits = QSerialPort.Data5 elif current_index == 1: self.serial_port.data_bits = QSerialPort.Data6 elif current_index == 2: self.serial_port.data_bits = QSerialPort.Data7 elif current_index == 3: self.serial_port.data_bits = QSerialPort.Data8 def onCombox_5IncdeChangeSlot(self): current_index = self.comboBox_5.currentIndex() if current_index == 0: self.serial_port.parity = QSerialPort.NoParity elif current_index == 1: self.serial_port.parity = QSerialPort.OddParity elif current_index == 2: self.serial_port.parity = QSerialPort.EvenParity def onPushButtonClickedSlot(self): if self.pushButton_flag: port_name = self.comboBox.currentText() if port_name != '': self.serial_port.setPort(self.serial_port.port[port_name]) self.serial_port.open(QSerialPort.ReadWrite) self.serial_port.setBaudRate(self.serial_port.baund_rate) self.serial_port.setStopBits(self.serial_port.stop_bits) self.serial_port.setDataBits(self.serial_port.data_bits) self.serial_port.setParity(self.serial_port.parity) self.pushButton_flag = False self.pushButton.setStyleSheet("border-image: url(:/pic/on.png);") self.comboBox.setEnabled(False) self.comboBox_2.setEnabled(False) self.comboBox_3.setEnabled(False) self.comboBox_4.setEnabled(False) self.comboBox_5.setEnabled(False) else: self.serial_port.close() self.pushButton_flag = True self.pushButton.setStyleSheet("border-image: url(:/pic/off.png);") self.comboBox.setEnabled(True) self.comboBox_2.setEnabled(True) self.comboBox_3.setEnabled(True) self.comboBox_4.setEnabled(True) self.comboBox_5.setEnabled(True) def onPushButton_2ClickedSlot(self): file_name, _ = QtWidgets.QFileDialog.getSaveFileName( self, '文件保存', './untitled.txt', 'Text files (*.txt)') result = '' with open(file_name, 'w') as fp: for text_list in self.textBrowser_text_list: text = "%s%s\n%s" % (text_list[0], text_list[2], text_list[1]) result = result + '\n' + text fp.write(result) def onPushButton_3ClickedSlot(self): self.textBrowser.clear() self.textBrowser_text_list = [] def onPushButton_4ClickedSlot(self): self.textEdit.clear() def onPushButton_5ClickedSlot(self): if not self.pushButton_flag: text = self.textEdit.toPlainText() if text != '': text_bytes = b'' if self.write_newLine_flag: text = text + '\r\n' if self.write_hex_flag: text_bytes = StringProcess.hexStringToStingBytes(text) self.serial_readyWrite_signal.emit(text, text_bytes, self.write_encodemode) def onRadioButtonToggledSlot(self): if self.radioButton.isChecked(): self.textBrowser_addTime_flag = True self.textBrowser.clear() for text_list in self.textBrowser_text_list: text = "%s%s\n%s" % (text_list[0], text_list[2], text_list[1]) result_filter = StringProcess.stringToHtmlFilter(text) if text_list[0] == '[SEND]:': result = StringProcess.stringToHtml( result_filter, self.send_color) else: result = StringProcess.stringToHtml( result_filter, self.receive_color) self.textBrowser.append(result) else: self.textBrowser_addTime_flag = False self.textBrowser.clear() for text_list in self.textBrowser_text_list: text = "%s\n%s" % (text_list[0], text_list[1]) result_filter = StringProcess.stringToHtmlFilter(text) if text_list[0] == '[SEND]:': result = StringProcess.stringToHtml( result_filter, self.send_color) else: result = StringProcess.stringToHtml( result_filter, self.receive_color) self.textBrowser.append(result) def onRadioButton_2ToggledSlot(self): if self.radioButton_2.isChecked(): self.textBrowser_hex_flag = True else: self.textBrowser_hex_flag = False def onRadioButton_3ToggledSlot(self): text = self.textEdit.toPlainText() if self.radioButton_3.isChecked(): self.write_hex_flag = True self.textEdit.textChanged.connect(self.textEditTextChangeSlot) if text != '': result = StringProcess.stringToHexString( text, self.write_encodemode) self.textEdit.clear() self.textEdit.setText(result) else: self.write_hex_flag = False self.textEdit.textChanged.disconnect(self.textEditTextChangeSlot) if text != '': result, flag = StringProcess.hexStringToSting( self.textEdit.toPlainText(), self.write_encodemode) if not flag: self.write_hex_flag = True self.radioButton_3.toggled.disconnect( self.onRadioButton_3ToggledSlot) self.radioButton_3.setChecked(True) self.radioButton_3.toggled.connect( self.onRadioButton_3ToggledSlot) QtWidgets.QMessageBox.warning(self, '警告', '输入的16进制字节串无法用utf-8解码,请确认!') self.textEdit.textChanged.connect( self.textEditTextChangeSlot) else: self.textEdit.clear() self.textEdit.setText(result) def onRadioButton_4ToggledSlot(self): self.write_encodemode = 'utf-8' def onRadioButton_5ToggledSlot(self): self.write_encodemode = 'gbk' def onRadioButton_6ToggledSlot(self): if self.radioButton_6.isChecked(): self.write_newLine_flag = True else: self.write_newLine_flag = False def textEditTextChangeSlot(self): text = self.textEdit.toPlainText() if text != '': cursor = self.textEdit.textCursor() col = cursor.columnNumber() row = cursor.blockNumber() document = self.textEdit.document() block_text = document.findBlockByNumber(row).text() self.textEdit.textChanged.disconnect(self.textEditTextChangeSlot) if self.textEdit_textNum < len(text): if col > 0: if ('0' <= block_text[col-1] <= '9') or ('a' <= block_text[col-1] <= 'f') \ or ('A' <= block_text[col-1] <= 'F'): if col > 1: if block_text[col - 2] != ' ': if col == len(block_text): self.textEdit.insertPlainText(' ') elif block_text[col] != ' ' and block_text[ col] != '\n': self.textEdit.insertPlainText(' ') elif block_text[col - 1] != ' ' and block_text[col - 1] != '\n': QtWidgets.QMessageBox.warning( self, '输入警告', '在16进制输入下只允许0-9、a-f、A-F!') ch = block_text[col - 1] text = text.strip(ch) self.textEdit.setText(text) self.textEdit.moveCursor(QtGui.QTextCursor.End, QtGui.QTextCursor.MoveAnchor) self.textEdit.textChanged.connect(self.textEditTextChangeSlot) self.textEdit_textNum = len(text) def serialWriteThreadFinishedSlot(self): text = self.textEdit.toPlainText() current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') setting = '[SEND]:' if self.write_hex_flag: setting = setting + '(hex)' temp_list = [setting, text, current_time] self.textBrowser_text_list.append(temp_list) if self.textBrowser_addTime_flag: result = "%s(%s)\n%s" % (setting, current_time, text) else: result = "%s\n%s" % (setting, text) result_filter = StringProcess.stringToHtmlFilter(result) self.textBrowser.append( StringProcess.stringToHtml(result_filter, self.send_color)) def serialReadThreadFinishedSlot(self, data): current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') setting = '[RECEIVE]:' if self.textBrowser_hex_flag: setting = setting + '(hex)' temp_list = [setting, data, current_time] self.textBrowser_text_list.append(temp_list) if self.textBrowser_addTime_flag: result = "%s(%s)\n%s" % (setting, current_time, data) else: result = "%s\n%s" % (setting, data) result_filter = StringProcess.stringToHtmlFilter(result) self.textBrowser.append( StringProcess.stringToHtml(result_filter, self.receive_color)) def serialReadyReadSlot(self): self.serial_readyRead_signal.emit(self.textBrowser_hex_flag)