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_()

运行效果:

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

     但是发现出了一个问题,就是点击“测试”按钮开始计算时,页面停止响应,直到计算结束,期间数字显示板一直显示为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_()

你可能感兴趣的:(PyQt5,Python)