python 简单检索器_python实现文件搜索工具(简易版)
在python学习过程中有一次需要进行GUI 的绘制,
而在python中有自带的库tkinter可以用来简单的GUI编写,于是转而学习tkinter库的使用。
学以致用,现在试着编写一个简单的磁文件搜索工具,
方法就是将指定的文件夹进行扫描遍历,把其中的每个文件路径数据存入数据库,
然后使用数据库搜索文件就很快捷。实现的效果大致如下:
整个程序分为大致几个模块:
主界面的绘制,
指定文件夹功能函数,
搜索文件功能函数,
ui线程与扫描线程同步函数,
扫描线程工作函数
要实现扫描文件功能时,
导入了一个这样的模块 disk.py
这个模块实现的功能就是将指定文件夹下的所有文件遍历,并将路径和所在盘符存到一个列表中返回
importosimportos.path as ptdefscan_file(path):
result=[]for root, dirs, files inos.walk(path):for f infiles:
file_path=pt.abspath(pt.join(root, f))
result.append((file_path, file_path[0]))#保存路径与盘符
return result
然后我们需要将扫描到的文件存入到数据库中,
因此需要编写数据库模块 datebase.py
importsqlite3classDataMgr:def __init__(self):#创建或打开一个数据库
#check_same_thread 属性用来规避多线程操作数据库的问题
self.conn = sqlite3.connect("file.db", check_same_thread=False)#建表
self.conn.execute('create table if not exists disk_table('
'id integer primary key autoincrement,'
'file_path text,'
'drive_letter text)')#创建索引 用来提高搜索速度
self.conn.execute('create index if not exists index_path on disk_table(file_path)')#批量插入数据
defbatch_insert(self, data):for line indata:
self.conn.execute('insert into disk_table values (null,?,?)', line)
self.conn.commit()#模糊搜索
defquery(self, key):
cursor=self.conn.cursor()
cursor.execute("select file_path from disk_table where file_path like ?", ('%{0}%'.format(key),))
r= [row[0] for row incursor]
cursor.close()returnrdefclose(self):
self.conn.close()
还需要一个额外的模块为 progressbar.py
这个模块的功能是在扫描时弹出一个进度条窗口,
使得GUI功能看起来更完善
from tkinter import *
from tkinter importttkclassGressBar:defstart(self):
top= Toplevel() #弹出式窗口,实现多窗口时经常用到
self.master =top
top.overrideredirect(True)#去除窗体的边框
top.title("进度条")
Label(top, text="正在扫描选定路径的文件,请稍等……", fg="blue").pack(pady=2)
prog= ttk.Progressbar(top, mode='indeterminate', length=200) #创建进度条
prog.pack(pady=10, padx=35)
prog.start()
top.resizable(False, False)#参数为false表示不允许改变窗口尺寸
top.update()#计算窗口大小,使显示在屏幕中央
curWidth =top.winfo_width()
curHeight=top.winfo_height()
scnWidth, scnHeight=top.maxsize()
tmpcnf= '+%d+%d' % ((scnWidth - curWidth) / 2, (scnHeight - curHeight) / 2)
top.geometry(tmpcnf)
top.mainloop()defquit(self):ifself.master:
self.master.destroy()
主体的search.py 代码:
1 from tkinter import *
2 from tkinter importttk3 importtkinter.filedialog as dir4 importqueue5 importthreading6 importprogressbar7 importdisk8 from database importDataMgr9
10
11 classSearchUI:12
13 def __init__(self):14 #创建一个消息队列
15 self.notify_queue =queue.Queue()16 root =Tk()17 self.master =root18 self.create_menu(root)19 self.create_content(root)20 self.path = 'D:'
21 root.title('the search tool')22 root.update()23 #在屏幕中心显示窗体
24 curWidth =root.winfo_width()25 curHeight =root.winfo_height()26 scnWidth, scnHeight = root.maxsize() #得到屏幕的宽度和高度
27 tmpcnf = '+%d+%d' % ((scnWidth - curWidth)/2, (scnHeight-curHeight)/2)28 root.geometry(tmpcnf)29
30 #创建一个进度条对话框实例
31 self.gress_bar =progressbar.GressBar()32
33 #创建一个数据库的实例
34 self.data_mgr =DataMgr()35
36 #在UI线程启动消息队列循环
37 self.process_msg()38 root.mainloop()39
40 #ui线程与扫描线程同步
41 defprocess_msg(self):42 #after方法,相当于一个定时器,
43 #第一个参数是时间的毫秒值,
44 #第二个参数指定执行一个函数
45 self.master.after(400, self.process_msg)46 #这样我们就在主线程建立了一个消息队列,
47 #每隔一段时间去消息队列里看看,
48 #有没有什么消息是需要主线程去做的,
49 #有一点需要特别注意,
50 #主线程消息队列里也不要干耗时操作,
51 #该队列仅仅用来更新UI。
52 while notself.notify_queue.empty():53 try:54 msg =self.notify_queue.get()55 if msg[0] == 1:56 self.gress_bar.quit()57
58 exceptqueue.Empty:59 pass
60
61 #扫描线程工作
62 defexecute_asyn(self):63 #定义一个scan函数,放入线程中去执行耗时扫描
64 defscan(_queue):65 ifself.path:66 paths = disk.scan_file(self.path) #位于disk.py
67 self.data_mgr.batch_insert(paths) #位于database.py
68
69 _queue.put((1,))70 th = threading.Thread(target=scan, args=(self.notify_queue,))71 th.setDaemon(True) #设置为守护进程
72 th.start()73
74 self.gress_bar.start()75
76 #菜单绘制
77 defcreate_menu(self, root):78 menu = Menu(root) #创建菜单
79
80 #二级菜单
81 file_menu = Menu(menu, tearoff=0)82 file_menu.add_command(label='设置路径', command=self.open_dir)83 file_menu.add_separator()84 file_menu.add_command(label='扫描', command=self.execute_asyn)85
86 about_menu = Menu(menu, tearoff=0)87 about_menu.add_command(label='version1.0')88
89 #在菜单栏中添加菜单
90 menu.add_cascade(label='文件', menu=file_menu)91 menu.add_cascade(label='关于', menu=about_menu)92 root['menu'] =menu93
94 #主界面绘制
95 defcreate_content(self, root):96 lf = ttk.LabelFrame(root, text='文件搜索')97 lf.pack(fill=X, padx=15, pady=8)98
99 top_frame =Frame(lf)100 top_frame.pack(fill=X, expand=YES, side=TOP, padx=15, pady=8)101
102 self.search_key =StringVar()103 ttk.Entry(top_frame, textvariable=self.search_key, width=50).pack(fill=X, expand=YES, side=LEFT)104 ttk.Button(top_frame, text="搜索", command=self.search_file).pack(padx=15, fill=X, expand=YES)105
106 bottom_frame =Frame(lf)107 bottom_frame.pack(fill=BOTH, expand=YES, side=TOP, padx=15, pady=8)108
109 band =Frame(bottom_frame)110 band.pack(fill=BOTH, expand=YES, side=TOP)111
112 self.list_val =StringVar()113 listbox = Listbox(band, listvariable=self.list_val, height=18)114 listbox.pack(side=LEFT, fill=X, expand=YES)115
116 vertical_bar = ttk.Scrollbar(band, orient=VERTICAL, command=listbox.yview)117 vertical_bar.pack(side=RIGHT, fill=Y)118 listbox['yscrollcommand'] =vertical_bar.set119
120 horizontal_bar = ttk.Scrollbar(bottom_frame, orient=HORIZONTAL, command=listbox.xview)121 horizontal_bar.pack(side=BOTTOM, fill=X)122 listbox['xscrollcommand'] =horizontal_bar.set123
124 #给list动态设置数据,set方法传入一个元组
125 self.list_val.set(('等待搜索',))126
127 #搜索文件
128 defsearch_file(self):129 ifself.search_key.get():130 result_data =self.data_mgr.query(self.search_key.get())131 ifresult_data:132 self.list_val.set(tuple(result_data))133
134 #指定文件夹
135 defopen_dir(self):136 d =dir.Directory()137 self.path = d.show(initialdir=self.path)138
139
140 if __name__ == '__main__':141 SearchUI()
问题总结:
1.UI线程负责界面的绘制与更新,如果在UI线程中进行耗时操作,会影响界面的流畅性,所以需要异步线程。
此时的问题在于UI的主线程与异步线程的通信问题,为什么一定要两个线程通信?
因为在大多数GUI界面编程中,异步线程都是不能对当前界面进行操作更新的,否则会引起界面混乱。
可以简单的理解成 如果异步线程也操作主界面,则两个线程对相同资源进行操作,就会导致混乱。
接下来的问题是tkinter中没有提供接口进行线程通信,因此我们通过消息队列的方式来同步线程,用到的类为Queue。
项目中当在消息队列中检索到消息为元组(1, )时,说明子线程(扫描)已经结束了,告知主线程可以结束子线程了。
2.扫描文件夹时需要将所选文件夹中的所有文件遍历一遍,发现python中提供了方法os.walk(path), 可以直接达到这一效果,所以说python在写代码时确实提供了方便。
3.该磁盘搜索工具用到的原理是将文件路径存到数据库中,再进行检索。 选用的数据库为sqlite,已经可以满足该项目的要求。在主线程创建数据库,子线程操作数据库,有可能出现问题,因此设置check_same_thread = false 来拒绝多线程的访问。
4.在进行GUI编程时,打算在扫描等待时添加一个进度条显示窗口,也就需要多窗口,用到了toplevel,表现为一个弹出式窗口,在使用toplevel时,要注意首先需要一个根窗口。
内容来源于网络如有侵权请私信删除
python 简单检索器_python实现文件搜索工具(简易版)相关推荐
- python简单装饰器_python装饰器的简单示例
这篇文章主要为大家详细介绍了python装饰器的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 装饰器的语法以 ...
- Find Any File for Mac,本地文件搜索工具
Find Any File for Mac是一款简单好用的本地文件搜索工具,可以让你在本地磁盘上搜索.查找任何文件,包括本地磁盘的名称. 创建或修改日期. 大小或类型和创建者代码等. 更好的结果:它为 ...
- python 遍历listbox_Python仿evething的文件搜索器 !
今天看到everything搜索速度秒杀windows自带的文件管理器,所以特地模仿everything实现了文件搜索以及打开对应文件的功能,首先来一张搜索对比图. 这是evething搜索效果: P ...
- python实现文件搜索工具(简易版)
在python学习过程中有一次需要进行GUI 的绘制, 而在python中有自带的库tkinter可以用来简单的GUI编写,于是转而学习tkinter库的使用. 学以致用,现在试着编写一个简单的磁文件 ...
- 文件搜索工具(Python实现)
文章目录 文件搜索工具介绍 代码实现 实现思路 os.walk函数 os.path.join函数 代码整体编写 打包成exe程序 效果展示 文件搜索工具介绍 文件搜索工具能够基于名称快速定位匹配的文件 ...
- 深挖你硬盘里的见不得人的【学习资料】,Python制作一款文件搜索工具
前言 今天来教大家做一个文件搜索工具,专门来找你电脑里的[学习资料],嘿嘿 开发环境 解释器: Python 3.8.8 | Anaconda, Inc. 编辑器: pycharm 专业版 先演示效果 ...
- 嗖一下【基于命令行交互的文件搜索工具】实现思路
目录 一.背景 二.实现功能(todo) 三.效果展示 四.分析 存储文件位置分析 存储文件内容分析 打印文件信息分析 五.实现 六.使用 七.代码实现 八.总结 九.项目测试 一.背景 有时候需要在 ...
- PDF Search for Mac(PDF文件搜索工具)
本次小编为您带来PDF Search for Mac破解版,这是Mac平台上一款可以帮助用户快速搜索文档,在Mac上从数千份文档中,快速搜索出你所需要的文档的PDF文件搜索工具!有了PDF Searc ...
- 项目:Search_Everything(仿EveryThing的文件搜索工具)
目录 项目总览 项目流程 项目搭建 maven项目 Database Navigator插件 类的设计和实现 Main类 resources包 app.fxml文件 init.sql文件 工具包Uti ...
最新文章
- 一图胜千言!数据可视化多维讲解
- 2 resize 到指定大小_阿里巴巴为什么让初始化集合时必须指定大小?
- C# T 泛型类,泛型方法的约束条件用法
- Spark On K8S 在有赞的实践与经验
- Android自定义progressBar
- 自动规避代码陷阱——自定义Lint规则
- hive中任意相邻时间段数据获取
- linux云存储软件,推荐5个Linux云存储解决方案
- MAC苹果电脑装单win10系统
- 女孩子没有事业就只能痛苦
- 搭建内网DNS服务器教程
- 用户行为分析的基本概览和常用名词解释
- RTL8723BU移植
- UG NX二次开发(C#)-CAM-加工模板、程序、方法、刀具和几何体的读取
- python 列表操作(完整版)
- 奥塔在线:Linux下按日期自动创建目录脚本
- 微信小程序--地理位置获取、导航
- glade java_Gtk+/Glade编程(一)--简介 | 学步园
- NISP二级换CISP的时候需要再花钱吗?【NISP】管理中心
- 深度报告:2020年债市复盘与历次牛熊拐点分析(20210110).PDF
热门文章
- 从键盘读取数据,回车才能显示的问题
- 把tomcat的8080改为80端口
- 问题:使用pandas中的DataFrame写入csv文件多出一行unnamed,如何解决呢??
- Tomcat启动会遇到的问题部分解决方案
- 【报告分享】2021年中国五大主流电商平台关于用户数据的最新规则汇总.pdf(附下载链接)...
- original_keras_version = f.attrs[‘keras_version‘].decode(‘utf8‘)AttributeError: ‘str‘ object has no
- pytorch查缺补漏之CUDA,自动求导
- android callmanager.java,如何使用Mobile-SDK-Android正确注销DJISDKManager和SDKManagerCallback应用程序?...
- 微信小程序实现日历功能(附加签到、迟到、未签的状态显示)
- 吴恩达机器学习笔记 1单变量线性回归