最近几天用python+pyqt5+QtDesigner编写了两个小软件,在这里做一个简单的总结。
1.创建新控件时需要指定父控件
2.可以在状态栏上添加额外的文本提示或者进度条显示
frame2_bar = QStatusBar()
self.sr_lable = QLabel(self.rom_frame)
self.sr_lable.setText('S: R: ')
elf.sr_lable.setGeometry(100, frame.height(), 50, 25)
frame2_bar.addPermanentWidget(self.sr_lable)
3.是TextEdit文本填满文本框后。自动向下滚屏
self.textEdit.moveCursor(QTextCursor.End)
self.textEdit.insertPlainText(out_s)
4.通过事件弹出自动义新窗口
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'time_display.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Dialog(object):
def setupUi(self, Dialog):
Dialog.setObjectName("Dialog")
Dialog.resize(280, 198)
self.widget = QtWidgets.QWidget(Dialog)
self.widget.setGeometry(QtCore.QRect(50, 20, 191, 151))
self.widget.setObjectName("widget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.label_2 = QtWidgets.QLabel(self.widget)
font = QtGui.QFont()
font.setPointSize(20)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.verticalLayout.addWidget(self.label_2)
self.label = QtWidgets.QLabel(self.widget)
font = QtGui.QFont()
font.setPointSize(20)
self.label.setFont(font)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.pushButton = QtWidgets.QPushButton(self.widget)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
self.retranslateUi(Dialog)
QtCore.QMetaObject.connectSlotsByName(Dialog)
def retranslateUi(self, Dialog):
from ex_pygui.time_display import Ui_Dialog # 显示自定义的弹出窗口
self.di = QDialog()
timedisplay = Ui_Dialog()
timedisplay.setupUi(self.di)
now = time.localtime()
timedisplay.label.setText('%02d:%02d:%02d' %(now.tm_hour, now.tm_min, now.tm_sec))
timedisplay.pushButton.clicked.connect(self.di.close)
self.di.setWindowModality(Qt.ApplicationModal) #锁定子窗口,关闭子窗口后才可以操作父窗口
self.di.show()
可以先创建一个QDialog窗口,然后在外部调用,如上代码所示
5.保存Excel文件为xlsx格式报错,可以将文件保存为xls格式
6.sqlite数据库确实简便好用
7.python的线程开启后,在死循环内会一直运行,无法暂停和关闭,需要重新编写定义
class ser_recvthread(threading.Thread):
def __init__(self, func):
super(ser_recvthread, self).__init__()
self.func = func
self.__flag = threading.Event() # 用于暂停线程的标识
self.__flag.set() # 设置为True
self.__running = threading.Event() # 用于停止线程的标识
self.__running.set() # 将running设置为True
def run(self):
while self.__running.isSet():
self.__flag.wait() # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
self.func()
def pause(self):
self.__flag.clear() # 设置为False, 让线程阻塞
def resume(self):
self.__flag.set() # 设置为True, 让线程停止阻塞
def stop(self):
self.__flag.clear()
self.__running.clear() # 设置为False
self.ser_thread = ser_recvthread(self.ser_recv)
self.ser_thread.start()
self.ser_thread.pause()
self.ser_thread.resume()
8.pyserial获取串口列表,并添加到combox中
import serial.tools.list_ports
self.ser_num.clear()
plist = list(serial.tools.list_ports.comports())
for i in range(0, len(plist)):
plist_0 = list(plist[i])
#print('串口号:', list(plist[i]),str(plist_0[0]))
self.ser_num.addItem(plist_0[0])
9.在这次写代码的过程中,我通过线程读取串口数据时,在数据量比较小,且发送数据比较慢的情况下,串口接收还比较正常,但是在数据量比较大且传输速度比较快时会出现卡死的情况,换成定时器定时1ms读取就没问题;不知道是线程部分的逻辑有问题还是怎么回事,暂时还没弄明白,暂且搁置,哪位大神如果看到这,有相关解决办法,欢迎指正。所以暂且推荐读取串口数据时采用定时读取的方式。
暂时就写到这,后续想到有必要记录的再继续添加。