今天突然想知道自学习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')+' ') #用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')+' ') #用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_()