重新基于PyQt5 grid的排列方式写了一个串口工具,可以全屏窗口,可以上下键调用历史命令,使用回车键发送命令等功能,待继续完善相关功能,希望大神指点!
import sys
import serial
import serial.tools.list_ports
# from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QLineEdit, QTextEdit, QWidget, QPushButton, QGroupBox, \
QApplication, QLabel, QComboBox, QGridLayout, QMessageBox
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QFont
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# self.setGeometry(300, 300, 500, 500)
self.setWindowTitle('串口调试小助手')
form1 = QGroupBox(self)
form1.setTitle('串口设置')
form1.setFont(QFont("Microsoft YaHei"))
f1_lab1 = QLabel('串口检测', self)
f1_lab1.setFont(QFont("Microsoft YaHei"))
f1_bt1 = QPushButton('串口检测', self)
f1_bt1.setFont(QFont("Microsoft YaHei"))
f1_lab2 = QLabel('选择串口', self)
f1_lab2.setFont(QFont("Microsoft YaHei"))
f1_box2 = QComboBox(self)
f1_box2.setFont(QFont("Microsoft YaHei"))
f1_lab3 = QLabel('选择波特率', self)
f1_lab3.setFont(QFont("Microsoft YaHei"))
f1_box3 = QComboBox(self)
f1_box3.setFont(QFont("Microsoft YaHei"))
f1_box3.insertItem(0, '115200')
f1_box3.insertItem(1, '74880')
f1_lab4 = QLabel('当前串口:', self)
f1_lab4.setFont(QFont("Microsoft YaHei"))
f1_lab5 = QLabel(self)
f1_lab5.setFont(QFont("Microsoft YaHei"))
f1_bt2 = QPushButton('打开串口', self)
f1_bt2.setFont(QFont("Microsoft YaHei"))
f1_bt3 = QPushButton('关闭串口', self)
f1_bt3.setFont(QFont("Microsoft YaHei"))
form2 = QGroupBox(self)
form2.setTitle('接收区')
form2.setFont(QFont("Microsoft YaHei"))
f2_text1 = QTextEdit(self)
f2_text1.setFont(QFont("Microsoft YaHei"))
f2_text1.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
form3 = QGroupBox(self)
form3.setTitle('发送区')
form3.setFont(QFont("Microsoft YaHei"))
f3_box1 = QComboBox(self)
f3_box1.setFont(QFont("Microsoft YaHei"))
f3_line1 = QLineEdit(self)
f3_line1.setFont(QFont("Microsoft YaHei"))
f3_bt1 = QPushButton('发送', self)
f3_bt1.setFont(QFont("Microsoft YaHei"))
f3_bt2 = QPushButton('清空', self)
f3_bt2.setFont(QFont("Microsoft YaHei"))
self.ser = serial.Serial()
self.timer = QTimer(self)
self.msg_index = 0
self.log_msg = []
self.log_list = []
self.form1 = form1
self.f1_lab1 = f1_lab1 #检测串口
self.f1_bt1 = f1_bt1 #检测串口
self.f1_lab2 = f1_lab2 #串口
self.f1_box2 = f1_box2 #串口下拉窗
self.f1_lab3 = f1_lab3 #波特率
self.f1_box3 = f1_box3 #波特率下拉窗
self.f1_lab4 = f1_lab4 #当前串口
self.f1_lab5 = f1_lab5 #当前串口信息
self.f1_bt2 = f1_bt2 #打开
self.f1_bt3 = f1_bt3 #关闭
self.form2 = form2 #接收区
self.f2_text1 = f2_text1 #接收文本框
self.form3 = form3 #发送区
self.f3_box1 = f3_box1 #发送记录
self.f3_line1 = f3_line1 #发送框
self.f3_bt1 = f3_bt1
self.f3_bt2 = f3_bt2
grid = QGridLayout()
grid.setSpacing(20)
grid.addWidget(form1, 1, 1, 8, 7)
grid.addWidget(f1_lab1, 2, 2, 1, 2)
grid.addWidget(f1_bt1, 2, 4, 1, 3)
grid.addWidget(f1_lab2, 3, 2, 1, 2)
grid.addWidget(f1_box2, 3, 4, 1, 3)
grid.addWidget(f1_lab3, 4, 2, 1, 2)
grid.addWidget(f1_box3, 4, 4, 1, 3)
grid.addWidget(f1_lab4, 5, 2, 1, 2)
grid.addWidget(f1_lab5, 5, 4, 1, 3)
grid.addWidget(f1_bt2, 6, 2, 1, 5)
grid.addWidget(f1_bt3, 7, 2, 1, 5)
grid.addWidget(form2, 1, 8, 20, 50)
grid.addWidget(f2_text1, 2, 9, 18, 48)
grid.addWidget(form3, 21, 8, 6, 50)
# grid.addWidget(f3_lab1, 22, 9, 1, 5)
# grid.addWidget(f3_lab2, 22, 14, 1, 35)
grid.addWidget(f3_box1, 23, 9, 1, 48)
grid.addWidget(f3_line1, 24, 9, 1, 48)
grid.addWidget(f3_bt1, 25, 42, 1, 6)
grid.addWidget(f3_bt2, 25, 51, 1, 6 )
self.setLayout(grid)
self.show()
self.f1_bt1.clicked.connect(self.port_check)
self.f1_box2.currentTextChanged.connect(self.port_info)
self.f1_bt2.clicked.connect(self.port_open)
self.f1_bt3.clicked.connect(self.port_close)
self.f3_line1.returnPressed.connect(self.send_data)
self.f3_bt1.clicked.connect(self.send_data)
self.timer.timeout.connect(self.receive_data)
def print1(self):
print('This is open button')
self.f2_text1.setText('this is open button in f2_text1')
self.text2.setText('this is open button in text2')
def print2(self):
print('This is close button')
self.f2_text1.clear()
self.text2.clear()
def port_check(self):
self.com_list = []
port_list =list(serial.tools.list_ports.comports())
self.f1_box2.clear()
for port in port_list:
self.com_list.append(port[0])
print(self.com_list)
self.f1_box2.addItems(self.com_list)
# self.com_list = 0
if len(self.com_list) == 0:
self.f1_box2.addItem("no port")
def port_info(self):
if self.f1_box2 != '':
self.f1_lab5.setText(self.f1_box2.currentText())
def port_open(self):
print('now port open')
self.ser.port = self.f1_box2.currentText()
self.ser.baudrate = int(self.f1_box3.currentText())
try:
self.ser.open()
except:
QMessageBox.critical(self, 'Port Error', "串口被占用!")
return
if self.ser.isOpen():
self.f1_bt2.setEnabled(False)
self.f1_bt3.setEnabled(True)
self.timer.start(2)
def port_close(self):
self.timer.stop()
try:
self.ser.close()
except:
pass
self.f1_bt2.setEnabled(True)
self.f1_bt3.setEnabled(False)
def send_data(self):
if self.ser.isOpen():
self.f2_text1.clear()
line_msg = self.f3_line1.text()
self.f3_line1.clear()
# self.f2_text1.setText(line_msg)
if line_msg !="":
self.log_msg.append(line_msg)
self.log_list.insert(0, line_msg)
self.msg_index = 0
line_msg = (line_msg + '\r\n').encode('utf-8')
self.ser.write(line_msg)
print(line_msg)
print(self.log_msg)
print(self.log_list)
def receive_data(self):
try:
line_msg = self.ser.inWaiting()
except:
self.port_close()
return
if line_msg > 0:
data = self.ser.read(line_msg)
self.f2_text1.insertPlainText(data.decode('iso-8859-1'))
textCursor = self.f2_text1.textCursor()
textCursor.movePosition(textCursor.End)
self.f2_text1.setTextCursor(textCursor)
else:
pass
def keyPressEvent(self, event):
print('press key')
n = len(self.log_msg)
if event.key() == Qt.Key_Up:
if self.msg_index >= n:
pass
else:
self.f3_line1.clear()
self.f3_line1.setText(self.log_list[self.msg_index])
self.msg_index += 1
if event.key() == Qt.Key_Down:
if self.msg_index < 0:
self.msg_index += 1
pass
else:
self.msg_index -= 1
self.f3_line1.clear()
self.f3_line1.setText(self.log_list[self.msg_index])
else:
pass
if __name__=='__main__':
app = QApplication(sys.argv)
ex = Example()
app.exit(app.exec_())
实现效果: