zoukankan      html  css  js  c++  java
  • 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')+'
    ')      #用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_()

  • 相关阅读:
    商城问题
    web基础重难点
    业务流程
    主流框架面试题
    数据库:索引-引擎-优化
    【jquey代码】基于选中的checkbox 删除对应的一行数据
    javascript中获取json对象的value,拼接到页面上
    【json对象和json格式的字符串】
    【idea中创建springMVC项目的2个坑】不识别@Autowired 以及 Mapper.xml的配置
    【eclipse和idea】创建spring项目时的一处不同
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6916580.html
Copyright © 2011-2022 走看看