当前位置:脚本大全 > > 正文

python函数式编程源码(python仿evething的文件搜索器实例代码)

时间:2021-10-04 01:22:26类别:脚本大全

python函数式编程源码

python仿evething的文件搜索器实例代码

今天看到everything搜索速度秒杀windows自带的文件管理器,所以特地模仿everything实现了文件搜索以及打开对应文件的功能,首先来一张搜索对比图。

这是evething搜索效果:

python函数式编程源码(python仿evething的文件搜索器实例代码)

这是自己实现的效果:

python函数式编程源码(python仿evething的文件搜索器实例代码)

主要功能就是python的os库的文件列表功能,sqllite创建表,插入数据以及模糊搜索,然后就是tkiner实现的界面功能。全部代码贴出来做一次记录,花费一天时间踩坑。

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • # coding=utf-8
  • import tkinter as tk
  • import tkinter.messagebox #这个是消息框,对话框的关键
  • import tkinter.constants
  • import sqlite3
  • import os
  • import threading
  • import traceback
  •  
  • def update_db():
  •   print("更新数据库")
  •   tkinter.messagebox.showerror("错误提示","更新数据库功能未完待续,可以删除目录下的allfiles.db文件,然后点击搜索,即可刷新数据库")
  •  
  • def mousecallback(*args):
  •   indexs = listb.curselection()
  •   index = int(indexs[0])
  •   print("index",index)
  •   start_directory = str(myarr[index])
  •   print(start_directory[2:-3])
  •   os.startfile(start_directory[2:-3])
  •  
  • def obtain_all_files(filepath,cursor):
  • #遍历filepath下所有文件,包括子目录
  •  try:
  •    files = os.listdir(filepath)
  •    for fi in files:
  •     fi_d = os.path.join(filepath,fi)
  •     if os.path.isdir(fi_d):
  •      obtain_all_files(fi_d,cursor)
  •     else:
  •      path = os.path.join(filepath,fi_d)
  •      update_progress.set(path)
  •      print("目录",path)
  •      sqladd = "insert into filepath (file_path) values ('"+path+"')"
  •      print("sqladd",sqladd)
  •      cursor.execute(sqladd)
  •  except exception as e:
  •    traceback.print_exc()
  •    print("扫描文件出异常了,点击确定继续扫描")
  •    tkinter.messagebox.showerror("错误提示","扫描文件出异常了看,点击确定继续扫描")
  •  
  •  
  •  
  •  
  • def scan_file():
  •   print("开始扫描文件")
  •  #  del myarr[:]
  •   connection.execute("begin transaction;") # 关键点
  •   cursor = connection.cursor()
  •   obtain_all_files('g:\\',cursor)
  •   print("g盘扫描完成...")
  •   tkinter.messagebox.showinfo("温馨提示","g盘扫描完成....")
  •   connection.execute("commit;") #关键点
  •   connection.commit()
  •   connection.close()
  •  
  •  
  • def insert_db():
  •    t1 = threading.thread(target=scan_file)
  •    t1.setdaemon(true)
  •    t1.start()
  •    tkinter.messagebox.showinfo("温馨提示","正在更新数据库,请等待...")
  •  
  • def search_file():
  •    #表示创建一个数据库,并获得连接
  •    print("数据库是否存在: ",isexistdb)
  •    if(isexistdb==false):
  •      tkinter.messagebox.showwarning("警告","数据库不存在,将更新数据库文件!")
  •      try:
  •        mycursor = connection.cursor()
  •        file_sql = "create table filepath('file_path' text not null)"
  •        mycursor.execute(file_sql)
  •        mycursor.close()
  •        insert_db()
  •      except:
  •        tkinter.messagebox.showerror("错误提示","数据库发生异常...")
  •        return
  •    else:
  •      print("开始搜索")
  •      listb.delete(0,tk.constants.end)
  •      mycursor = connection.cursor()
  •      entry_text = inputtext.get()
  •      search_sql = "select * from filepath where file_path like '%"+entry_text+"%'"
  •      files = mycursor.execute(search_sql)
  •      #tkinter.messagebox.showwarning("警告","没有找到对应的文件!")
  •      for f in files:
  •       print(f)
  •       myarr.append(f)
  •       listb.insert(tkinter.constants.end,f)
  •      print("搜索完成")
  •      mycursor.close()
  •  
  • myarr = []
  • isexistdb = os.path.exists("allfiles.db")
  • connection = sqlite3.connect("allfiles.db",check_same_thread = false)
  • root = tk.tk() # 初始化tk()
  • root.title("电脑文件搜索工具(仿everything)by景兄弟v1.0"# 设置窗口标题
  • root.geometry("800x600"# 设置窗口大小 注意:是x 不是*
  • root.resizable(width=false, height=false) # 设置窗口是否可以变化长/宽,false不可变,true可变,默认为true
  • #设置输入框
  • inputtext = tk.entry(root,show=none,foreground = 'red',font = ('helvetica', '15', 'bold'),insertbackground = 'green',width=65)
  • inputtext.pack()
  • #设置按钮,以及放置的位置
  • searchbtn = tk.button(root, text="搜索", fg="blue",bd=2,width=10,command=search_file)#command中的方法带括号是直接执行,不带括号才是点击执行
  • searchbtn.place(x=200, y=40, anchor='nw')
  • updatebtn = tk.button(root, text="更新数据库", fg="blue",bd=2,width=10,command=update_db)
  • updatebtn.place(x=400, y=40, anchor='nw')
  •  
  • update_progress = tk.stringvar()
  • update_progress.set('还未开始扫描')
  • lb = tk.label(root,text="还未开始", fg="blue",bd=2,width=100, textvariable=update_progress)
  • lb.place(x=20,y=90)
  •  
  • listb = tk.listbox(root,width=110,height=20)
  • listb.place(x=1, y=120, anchor='nw')
  • sb = tk.scrollbar(root)  #垂直滚动条组件
  • sb.pack(side=tkinter.constants.right,fill=tkinter.constants.y) #设置垂直滚动条显示的位置
  • listb.config(yscrollcommand=sb.set)
  • listb.bind("<<listboxselect>>",mousecallback)
  • root.mainloop() # 进入消息循环
  • 以上所述是小编给大家介绍的python仿evething的文件搜索器详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对开心学习网网站的支持!

    原文链接:https://blog.csdn.net/u012539700/article/details/89819630
    上一篇下一篇

    猜您喜欢

    热门推荐