PyQt5学习随笔01--计算一个文件夹里我们码的代码行数&&PyQt的多线程通信

    今天突然想知道自学习Python以来我一共码了多少行代码了,于是写了一个简单的程序:
__author__ = 'jiangzhiheng'
# coding=utf-8
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import glob

global lines
lines = 0

def count_work():
    main()

def main():
    global lines
    py_filenames = glob.glob('C:\\Users\\jiangzhiheng\\Desktop\\python\\*.py')
    for filename in py_filenames:
        if filename:
            for line in open(filename,'rb').readlines():   #以二进制读,否则会出现UnicodeEncodeError
                if line:
                    lines+=1                                #统计代码行数
                    lcdNumber.display(lines)
                    myfile = open('all.txt','a')
                    myfile.write(line.decode('utf-8')+'\n')      #用decode函数将二进制数据转为str
                    myfile.close()


app= QApplication([])
mywindow = QWidget()
layout = QVBoxLayout(mywindow)     #垂直布局
lcdNumber = QLCDNumber()
layout.addWidget(lcdNumber)    #增加数字显示屏
button = QPushButton('测试')
layout.addWidget(button)       #增加按钮

button.clicked.connect(count_work)       #将button按钮连接到count_work函数槽

mywindow.show()
app.exec_()

运行效果:


     但是发现出了一个问题,就是点击“测试”按钮开始计算时,页面停止响应,直到计算结束,期间数字显示板一直显示为0。发现原因如下:因为 Qt 中所有界面都是在 UI 线程中(也被称为主线程,就是执行了QApplication::exec()的线程),在执行一些耗时的操作,就会阻塞 UI 线程,从而让界面停止响应。为避免这个问题,考虑另外加一个线程执行那个循环:

__author__ = 'jiangzhiheng'
# coding=utf-8
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import glob    #glob模块获取文件名,类似于windowsde 搜索功能,支持"?,[],*"通配符,用法如下面例子所示

global lines               #定义一个全局变量用于计数
lines = 0
global directory
directory = ''

class MyThread(QThread):             #创建一个新QThread类
    def __init__(self):
        super(MyThread,self).__init__()

    def run(self):                  #重新定义run函数,run函数就是新线程要执行的的代码
        global lines
        py_filenames = glob.glob(directory+'\\*.py')
        for filename in py_filenames:
            if filename:
                for line in open(filename,'rb').readlines():   #以二进制读,否则会出现UnicodeEncodeError
                    if line:
                        lines+=1                                #统计代码行数
                        lcdNumber.display(lines)
                        myfile = open('Lines.txt','a')
                        myfile.write(line.decode('utf-8')+'\n')      #用decode函数将二进制数据转为str
                        myfile.close()

def main():                 ##定义槽函数
    global directory        #引用全局变量
    directory = QFileDialog.getExistingDirectory(mywindow,'选择文件夹',
                                                 'C:\\')             #这里改为自己选择文件夹
    myThread = MyThread()
    myThread.start()



app= QApplication([])
mywindow = QWidget()              #创建一个新窗口
layout = QVBoxLayout(mywindow)     #垂直布局
lcdNumber = QLCDNumber()
layout.addWidget(lcdNumber)    #增加数字显示屏
button = QPushButton('测试')
layout.addWidget(button)       #增加按钮

button.clicked.connect(main)       #将button按钮连接到count_work函数槽

mywindow.show()
app.exec_()

1、资源项目源均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值