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.py
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QIcon
import sys
import os
import threading
class 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, QtCore
from testqt.TEST_QT_FROM import Ui_Dialog
import sys
from PyQt5.QtCore import *
import time

# 继承QThread
class 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_())

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

(0)

相关推荐

  • PyQt5中多线程模块QThread使用方法的实现

    本文主要讲解使用多线程模块QThread解决PyQt界面程序唉执行耗时操作时,程序卡顿出现的无响应以及界面输出无法实时显示的问题.用户使用工具过程中出现这些问题时会误以为程序出错,从而把程序关闭.这样,导致工具的用户使用体验不好.下面我们通过模拟上述出现的问题并讲述使用多线程QThread模块解决此类问题的方法. PyQt程序卡顿和无法实时显示问题现象 使用PyQt界面程序,点击运行按钮后,程序在显示框中每秒打印1个数字.程序代码如下: # -*- coding: utf-8 -*- impor

  • PyQt5多线程刷新界面防假死示例

    在做GUI界面时我们希望后台任务能够与UI分开,在PyQt中,主线程用来重绘界面.而子线程里边的实时处理结果需要反馈到界面,子线程里边不能执行界面更新操作. wxpython多线程刷新界面转到 https://www.jb51.net/article/176308.htm 下面给出类Python3+PyQt5多线程防假死动态刷新界面的模板 from PyQt5 import QtWidgets, QtCore import sys from PyQt5.QtCore import * impor

  • python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例

    本文在上文的基础上重新实现支持多线程的服务器. 以下为TCP客户端的程序代码: #!/usr/bin/env python3 import sys from PyQt5.QtCore import (QByteArray, QDataStream, QDate, QIODevice, QRegExp, Qt) from PyQt5.QtWidgets import (QApplication, QDateEdit, QFrame, QGridLayout, QHBoxLayout, QLabel

  • 浅谈PyQt5中异步刷新UI和Python多线程总结

    目前任务需要做一个界面程序,PyQt是非常方便的选择,QT丰富的控件以及python方便的编程.近期遇到界面中执行一些后台任务时界面卡死的情况,解决了在这里记录下. PyQt PyQt简介 PyQt是Qt的python接口,PyQt的文档较少,但接口和函数可以完全参照Qt,继承了Qt中大量的控件以及信号机制,十分方便.以下简介一个基本的PyQt程序. - 需要导入的类主要来自三个包 - from PyQt5.QtWidgets import 常用的控件 - PyQt5.QtCore 核心功能类,

  • PyQt5多线程防卡死和多窗口用法的实现

    心得:写着写着找到了自己的感觉,还是需要大量的代码和项目来加深对代码的理解 一.PyQt5多线程防卡死 在界面中,通常用会有一些按钮,点击后触发事件,比如去下载一个文件或者做一些操作,这些操作会耗时,如果不能及时结束,主线程将会阻塞,这样界面就会出现未响应的状态,因此必须使用多线程来解决这个问题. # -*- coding: UTF-8 -*- """"================================================= @Projec

  • PYQT5开启多个线程和窗口,多线程与多窗口的交互实例

    每点击一次按钮,弹出一个对话框(子窗口),同时开启一个子线程来执行任务并更新对话框内容,关闭对话框则关闭对应子线程 1. 建立一个简单的主界面和一个自定义对话框 from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(327,

  • python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例

    PyQt5简单多线程信号与槽的使用 最简单的多线程使用方法是利用QThread函数,展示QThread函数和信号简单结合的方法 import sys from PyQt5.QtCore import * from PyQt5.QtWidgets import * class Main(QWidget): def __init__( self, parent=None ): super(Main, self).__init__(parent) #创建一个线程实例并设置名称 变量 信号与槽 self

  • Pyqt5 实现多线程文件搜索的案例

    我学Java的时候也用Swing做了一个文件搜索的小程序,但界面真的挺丑的,现在学了点python,感觉python是最简单的语言,没有之一. (大家没事都可以来学的,真的很简单有趣哦) 我采用的是pyqt5,所以需要先安装Pyqt5模块 直接cmd命令输入 pip install pyqt5 闲言少叙,上代码!! # -*- coding: utf-8 -*- # @Time : 2018\9\15 20:39 # @Author : Tang weiyang # @File : FileSe

  • Java并发(Runnable+Thread)实现硬盘文件搜索功能

    零.插播2020CSDN博客之星投票新闻 近日(1月11日-1月24日),2020CSDN博客之星评选正在火热进行中,作为码龄1年的小白有幸入选Top 200,首先很感谢CSDN官方把我选上,本来以为只是来凑热闹,看大佬们PK . 综合过去9天大佬们战况,前10名大佬基本坐得很稳,后期出现黑马发力,势不可挡,都在冲刺Top 20,有了微妙的变化,不得不令人佩服点赞!真正的实力可以看出,文章数量不重要,更重要的是质量!一切用数据说话,如图: 截至 2021-01-20 11:50:02 看了大佬的

  • Java实现一个简单的文件上传案例示例代码

    Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘中 下面上代码 上传单个文件 服务器端 package FileUpload; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.Serve

  • Java多线程文件分片下载实现的示例代码

    多线程下载介绍 多线程下载技术是很常见的一种下载方案,这种方式充分利用了多线程的优势,在同一时间段内通过多个线程发起下载请求,将需要下载的数据分割成多个部分,每一个线程只负责下载其中一个部分,然后将下载后的数据组装成完整的数据文件,这样便大大加快了下载效率.常见的下载器,迅雷,QQ旋风等都采用了这种技术. 分片下载 所谓分片下载就是要利用多线程的优势,将要下载的文件一块一块的分配到各个线程中去下载,这样就极大的提高了下载速度. 技术难点 并不能说是什么难点,只能说没接触过不知道罢了. 1.如何请

  • Python3中PyQt5简单实现文件打开及保存

    本文主要介绍了Python3中PyQt5简单实现文件打开及保存,分享给大家,具体如下: # -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'filemanage.ui' # # Created by: PyQt5 UI code generator 5.12.2 # # WARNING! All changes made in this file will be lost! from PyQt

  • Java对文件进行基本操作案例讲解

    File文件类 java.io.File是文件和目录的重要类(JDK6及以前是唯一) 目录也使用File类进行表示 File类与操作系统无关,但会受到操作系统的权限限制 常用方法 createNewFile , delete , exists , getAbsolutePath , getName , getParent , getPath isDirectory , isFile , length , listFiles , mkdir , mkdirs File不涉及到具体的文件内容.只会涉

  • QT实现多线程两种方式案例详解

    Qt线程 Qt4.7之前版本处理步骤 1.自定义一个类,继承于QThread. class MyThread:public QThread{ public: vid run(); //虚函数 线程处理函数(和主线程不在同一个线程) signals: void isDone(); //信号 线程执行完发送 } void MyThread::run() { // 实现 -- 复杂的处理过程 emit isDome; // 发送线程 }; 2.定义线程 MyThread thread; 3.开启线程

  • JavaScript 上传文件限制参数案例详解

    项目场景: 1,上传文件限制 功能作用: 1,防止前端操作上传异常文件 2,限制符合的规则,优化展示模型 功能实现: 1,获取file实例 2,执行校验规则方法 代码如下: //大小限制 checkFileSize(file, rules) { return new Promise((resolve, reject) => { file.size / 1024 / 1024 > rules ? reject() : resolve() }).then( () => { return tr

  • JavaScript 使用Ckeditor+Ckfinder文件上传案例详解

    目录 一.准备工作 二.解压 三.开始集成 一.准备工作 Ckeditor_4.5.7_full + Ckfinder_java_2.6.0 二.解压 1.解压ckeditor,和平常文件解压相同,正常解压即可 2.解压ckfinder,解压完成后进入ckfinder文件夹下,发现有CKFinderJava-2.6.0.war文件,继续解压. 3.注意看红框部分 三.开始集成 1.准备工作完成,将图1中的ckeditor,及图3中的ckfinder文件夹拷贝到我们自己的项目的WebContent

  • Python文件操作实战案例之用户登录

    目录 一.前言 二.案例:用户登录 1.案例分析 2.程序设计 2.1 main() 2.2 c_flag() 2.3 init() 2.4 print_login_menu() 2.5 user_select() 2.6 root_login() 2.7 user_register() 2.8 user_login() 3.功能演示 总结 一.前言 在上一小节,我们介绍了文件的基本操作以及数据交换的格式,为了巩固我们上一节文件操作的知识. 在这里我们做一个最基本的案例:用户登录 二.案例:用户

随机推荐