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

  • 相关阅读:
    ubuntu15.04下安装配置docker
    在Vmware/VirtualBox虚拟机环境中正确打开虚拟机
    windows下使用cx_freeze将Python程序打包成exe可执行文件
    Python正则表达式学习小结
    Ubuntu环境下利用Python3+PyQt5+Eric6进行GUI编程
    C#学习笔记——控件篇
    商务英语学习第一课(lending(借贷))
    Ajax的请求方式:get和post
    XML就像是扩展应用范围的HTML
    JQ数组=jQuery对象数组
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6916580.html
Copyright © 2011-2022 走看看