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

来源:互联网 发布:python 符号错误 编辑:程序博客网 时间:2024/06/03 10:59
    今天突然想知道自学习Python以来我一共码了多少行代码了,于是写了一个简单的程序:
__author__ = 'jiangzhiheng'# coding=utf-8from PyQt5.QtCore import *from PyQt5.QtWidgets import *from PyQt5.QtGui import *import globglobal lineslines = 0def 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-8from PyQt5.QtCore import *from PyQt5.QtWidgets import *from PyQt5.QtGui import *import glob    #glob模块获取文件名,类似于windowsde 搜索功能,支持"?,[],*"通配符,用法如下面例子所示global lines               #定义一个全局变量用于计数lines = 0global directorydirectory = ''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_()

0 0