您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Pyqt5 实现多线程文件搜索的案例

51自学网 2021-10-30 22:49:02
  python
这篇教程Pyqt5 实现多线程文件搜索的案例写得很实用,希望能帮到您。

我学Java的时候也用Swing做了一个文件搜索的小程序,但界面真的挺丑的,现在学了点python,感觉python是最简单的语言,没有之一。 (大家没事都可以来学的,真的很简单有趣哦)

我采用的是pyqt5,所以需要先安装Pyqt5模块

直接cmd命令输入

pip install pyqt5

闲言少叙,上代码!!

# -*- coding: utf-8 -*-# @Time  : 2018/9/15 20:39# @Author : Tang weiyang# @File  : FileSearch02.pyfrom PyQt5.QtCore import *from PyQt5.QtWidgets import *from PyQt5.QtGui import QIconimport sysimport osimport threadingclass fileSearchThread(QThread):  sinOut = pyqtSignal(str)  # 自定义信号,执行run()函数时,从相关线程发射此信号  def __init__(self,key):    super().__init__()    self.key = key  def run(self):    threads=[]    path = [r"c://", r"d://", r"e://", r"f://"]    #通过多线程对windows下的多个盘符进行文件的遍历查找    for each in path:      t = threading.Thread(target=self.search, args=(self.key,each,))      threads.append(t)      t.start()    for i in range(len(threads)): #将主线程阻塞      threads[i].join()    print("搜索结束")  def search(self,keyword, path):    for dirpath, dirnames, filenames in os.walk(path):      for filename in filenames:        if filename.__contains__(keyword):          print(os.path.join(dirpath, filename))          self.sinOut.emit(os.path.join(dirpath, filename))      for folder in dirnames:        if folder.__contains__(keyword):          print(os.path.join(dirpath,folder))          self.sinOut.emit(os.path.join(dirpath,folder))class fileSearch(QListWidget):  def __init__(self):    super().__init__()    self.Ui()  def Ui(self):    self.key= QLineEdit()    self.bt=QPushButton("搜索")    self.result = QListWidget()    self.bt.clicked.connect(self.ButtonClicked) #按钮单击信号绑定到槽    # self.line.editingFinished.connect(self.Action)    self.key.editingFinished.connect(self.ButtonClicked)    grid = QGridLayout()    grid.setSpacing(10) # 创建标签之间的空间    grid.addWidget(self.key, 1, 0) # (1,0)表示显示的位置    grid.addWidget(self.bt, 1, 1)    grid.addWidget(self.result, 2, 0, 5, 2) # 指定组件的跨行和跨列的大小,指定这个元素跨5行显示    self.setLayout(grid)    for i in range(1,100):      self.result.addItem("搜索"+str(i)+"个项目")    self.result.itemClicked.connect(self.Clicked)    self.setGeometry(300, 300, 500, 500)    self.setWindowTitle('文件搜索')    self.setWindowIcon(QIcon('icon.jpg'))    self.show()  def Clicked(self, item):    QMessageBox.information(self, "ListWidget", "You clicked: " + item.text())    os.startfile(item.text()) #打开文件  def ButtonClicked(self):    # 创建新线程,将自定义信号sinOut连接到slotAdd()槽函数    keyword = self.key.text()    self.result.clear()    self.thread=fileSearchThread(keyword)    self.thread.sinOut.connect(self.slotAdd)    self.thread.start()  def slotAdd(self,filename):    self.result.addItem(str(filename))if __name__ == '__main__':  app = QApplication(sys.argv)  ex = fileSearch()  sys.exit(app.exec_())

这个小程序可以搜索本地所有的文件,时间大概在10秒左右,点击文件的地址,就可以打开这个文件.多线程这个有点卡壳,然后写的很变扭.

这个小程序还有一个小感悟:

涉及到GUI的程序最好要将UI界面和数据处理(还包括大批量文件的读取,循环计算),否则会导致UI界面无响应,这一点可以参考我的代码,通过一个多线程很好解决这个问题

线程之间的信息传递,可以通过信号和槽完成,

sinOut = pyqtSignal(str) #自定义一个信号槽self.thread.sinOut.connect(self.slotAdd)#信号绑定到槽self.sinOut.emit(os.path.join(dirpath,folder)) #发射信号

pyqt的布局真的很好用,GridLayout真的超级好用

效果图如下

补充:pyqt5多线程-简单例子

一、主要代码逻辑

from PyQt5 import QtWidgets, QtCorefrom testqt.TEST_QT_FROM import Ui_Dialogimport sysfrom PyQt5.QtCore import *import time# 继承QThreadclass Runthread(QtCore.QThread):  # python3,pyqt5与之前的版本有些不一样  # 通过类成员对象定义信号对象  _signal = pyqtSignal(str)   def __init__(self):    super(Runthread, self).__init__()   def __del__(self):    self.wait()   def run(self):    print("run 666")    self._signal.emit("run 666"); # 信号发送 class TestQtFromC(QtWidgets.QWidget, Ui_Dialog):  text =""  def __init__(self):    super(TestQtFromC, self).__init__()    self.setupUi(self)   #click  def timer_click(self):    self.thread = Runthread() # 创建线程    self.thread._signal.connect(self.callbacklog) # 连接信号    self.thread.start() # 开始线程   # callback  def callbacklog(self, msg):    self.text =self.text+time.strftime("%Y-%m-%d %H:%M:%S ", time.localtime())+msg+ "/n"    print(self.text)    # 回调数据输出到文本框    self.textEdit.setText(self.text); if __name__ == "__main__":  app = QtWidgets.QApplication(sys.argv)  mTestQtFromC = TestQtFromC()  mTestQtFromC.show()  sys.exit(app.exec_())

以上为个人经验,希望能给大家一个参考,也希望大家多多支持51zixue.net。如有错误或未考虑完全的地方,望不吝赐教。


PyQt5按下按键选择文件夹并显示的实现
pyqt添加启动等待界面的操作
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。