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如何实现数据库表格动态增删改
Python+PyQt如何实现数据库表格动态增删改小编给大家分享一...
-
PyQt5如何使用mimeData实现拖拽事件
PyQt5如何使用mimeData实现拖拽事件小编给大家分享一下P...
-
Python PyQt5如何实现文件拷贝器
PythonPyQt5如何实现文件拷贝器这篇文章将为大家详细讲解...
-
pyqt5与html数据交互的原理是什么
pyqt5与html数据交互的原理是什么本文小编为大家详细介绍“p...
-
怎么用Python+PyQT5实现手绘图片生成器
怎么用Python+PyQT5实现手绘图片生成器本篇内容主要讲解“...
-
如何使用PyQT5制作一个敏感词检测工具
如何使用PyQT5制作一个敏感词检测工具小编给大家分享一下如何使用...
-
怎么用PyQT5制作一个桌面摸鱼工具
怎么用PyQT5制作一个桌面摸鱼工具这篇文章主要介绍“怎么用PyQ...
-
如何在pyqt5中展示pyecharts生成的图像
如何在pyqt5中展示pyecharts生成的图像这期内容当中小编...
-
如何实现pyqt5圆形label显示打开的摄像头功能
如何实现pyqt5圆形label显示打开的摄像头功能这篇文章主要介...
-
pyqt5蒙版遮罩mask,setmask的使用
1.理解mask()和setmask()一般是在pyqt绘图时常见,而且在显示不规则图形时更是常见。参考书籍上说:setM...
