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怎么实现多线程文件搜索

补充: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怎么实现多线程文件搜索”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

发布于 2021-03-17 20:53:43
收藏
分享
海报
0 条评论
160
上一篇:Vue组件传值过程中丢失数据怎么办 下一篇:SpringBoot+netty-socketio如何实现服务器端消息推送
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码