Pyqt5怎么实现多线程文件搜索
作者
这篇文章将为大家详细讲解有关Pyqt5怎么实现多线程文件搜索,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
我采用的是pyqt5,所以需要先安装Pyqt5模块
直接cmd命令输入
pipinstallpyqt5
闲言少叙,上代码!!
#-*-coding:utf-8-*- #@Time:2018\9\1520:39 #@Author:Tangweiyang #@File:FileSearch02.py fromPyQt5.QtCoreimport* fromPyQt5.QtWidgetsimport* fromPyQt5.QtGuiimportQIcon importsys importos importthreading classfileSearchThread(QThread): sinOut=pyqtSignal(str) #自定义信号,执行run()函数时,从相关线程发射此信号 def__init__(self,key): super().__init__() self.key=key defrun(self): threads=[] path=[r"c:\\",r"d:\\",r"e:\\",r"f:\\"] #通过多线程对windows下的多个盘符进行文件的遍历查找 foreachinpath: t=threading.Thread(target=self.search,args=(self.key,each,)) threads.append(t) t.start() foriinrange(len(threads)):#将主线程阻塞 threads[i].join() print("搜索结束") defsearch(self,keyword,path): fordirpath,dirnames,filenamesinos.walk(path): forfilenameinfilenames: iffilename.__contains__(keyword): print(os.path.join(dirpath,filename)) self.sinOut.emit(os.path.join(dirpath,filename)) forfolderindirnames: iffolder.__contains__(keyword): print(os.path.join(dirpath,folder)) self.sinOut.emit(os.path.join(dirpath,folder)) classfileSearch(QListWidget): def__init__(self): super().__init__() self.Ui() defUi(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) foriinrange(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() defClicked(self,item): QMessageBox.information(self,"ListWidget","Youclicked:"+item.text()) os.startfile(item.text())#打开文件 defButtonClicked(self): #创建新线程,将自定义信号sinOut连接到slotAdd()槽函数 keyword=self.key.text() self.result.clear() self.thread=fileSearchThread(keyword) self.thread.sinOut.connect(self.slotAdd) self.thread.start() defslotAdd(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多线程-简单例子
一、主要代码逻辑
fromPyQt5importQtWidgets,QtCore fromtestqt.TEST_QT_FROMimportUi_Dialog importsys fromPyQt5.QtCoreimport* importtime #继承QThread classRunthread(QtCore.QThread): #python3,pyqt5与之前的版本有些不一样 #通过类成员对象定义信号对象 _signal=pyqtSignal(str) def__init__(self): super(Runthread,self).__init__() def__del__(self): self.wait() defrun(self): print("run666") self._signal.emit("run666");#信号发送 classTestQtFromC(QtWidgets.QWidget,Ui_Dialog): text="" def__init__(self): super(TestQtFromC,self).__init__() self.setupUi(self) #click deftimer_click(self): self.thread=Runthread()#创建线程 self.thread._signal.connect(self.callbacklog)#连接信号 self.thread.start()#开始线程 #callback defcallbacklog(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_())
关于“Pyqt5怎么实现多线程文件搜索”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
目录
推荐阅读
-
Python+PyQt如何实现数据库表格动态增删改
-
PyQt5如何使用mimeData实现拖拽事件
-
Python PyQt5如何实现文件拷贝器
-
pyqt5与html数据交互的原理是什么
pyqt5与html数据交互的原理是什么本文小编为大家详细介绍“p...
-
怎么用Python+PyQT5实现手绘图片生成器
-
如何使用PyQT5制作一个敏感词检测工具
-
怎么用PyQT5制作一个桌面摸鱼工具
怎么用PyQT5制作一个桌面摸鱼工具这篇文章主要介绍“怎么用PyQ...
-
如何在pyqt5中展示pyecharts生成的图像
-
如何实现pyqt5圆形label显示打开的摄像头功能
-
pyqt5蒙版遮罩mask,setmask的使用
0 条评论
本站已关闭游客评论,请登录或者注册后再评论吧~