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

执行效果:


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

posted on 2017-05-28 20:32  yjbjingcha  阅读(164)  评论(0编辑  收藏  举报

导航