python pyqt5开发小结

最近几天用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读取就没问题;不知道是线程部分的逻辑有问题还是怎么回事,暂时还没弄明白,暂且搁置,哪位大神如果看到这,有相关解决办法,欢迎指正。所以暂且推荐读取串口数据时采用定时读取的方式。

暂时就写到这,后续想到有必要记录的再继续添加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值