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