zoukankan      html  css  js  c++  java
  • Tkinter 之磁盘搜索工具实战

    一、效果图

     

     

     

     

     

     二、代码

    miniSearch.py

    from tkinter import *
    from tkinter import ttk, messagebox, filedialog
    from threading import Thread
    import os
    import queue
    import loadingDialog
    import re
    
    
    class Application_UI(object):
        # 默认查找路径
        search_path = os.path.abspath("./")
        # 是否开始查找标志
        is_start = 0
        
        def __init__(self):
            # 设置UI界面
            self.window = Tk()
            win_width = 600
            win_height = 500
            screen_width = self.window.winfo_screenwidth()
            screen_height = self.window.winfo_screenheight()
            x = int((screen_width - win_width) / 2)
            y = int((screen_height - win_height) / 2)
            self.window.title("磁盘文件搜索工具")
            self.window.geometry("%sx%s+%s+%s" % (win_width, win_height, x, y))
            # 最好用绝对路径
            self.window.iconbitmap(r"G:PyCharm 2019.1projectTK项目磁盘搜索工具icon.ico")
            #
            
            top_frame = Frame(self.window)
            top_frame.pack(side = TOP, padx = 5, pady = 20, fill = X)
            
            self.search_val = StringVar()
            entry = Entry(top_frame, textvariable = self.search_val)
            entry.pack(side = LEFT, expand = True, fill = X, ipady = 4.5)
            
            search_btn = Button(top_frame, text = "搜索", width = 10, command = self.search_file)
            search_btn.pack(padx = 10)
            
            bottom_frame = Frame(self.window)
            
            bottom_frame.pack(side = LEFT, expand = True, fill = BOTH, padx = 5)
            
            tree = ttk.Treeview(bottom_frame, show = "headings", columns = ("name", "path"))
            self.treeView = tree
            y_scroll = Scrollbar(bottom_frame)
            y_scroll.config(command = tree.yview)
            y_scroll.pack(side = RIGHT, fill = Y)
            x_scroll = Scrollbar(bottom_frame)
            x_scroll.config(command = tree.yview, orient = HORIZONTAL)
            x_scroll.pack(side = BOTTOM, fill = X)
            tree.config(xscrollcommand = x_scroll.set, yscrollcommand = y_scroll.set)
            
            tree.column("name", anchor = "w", width = 8)
            tree.column("path", anchor = "w")
            tree.heading("name", text = "文件名称", anchor = "w")
            tree.heading("path", text = "路径", anchor = "w")
            tree.pack(side = LEFT, fill = BOTH, expand = True, ipady = 20)
            
            menu = Menu(self.window)
            self.window.config(menu = menu)
            
            set_path = Menu(menu, tearoff = 0)
            set_path.add_command(label = "设置路径", accelerator="Ctrl + F", command = self.open_dir)
            set_path.add_command(label = "开始扫描", accelerator="Ctrl + T", command = self.search_file)
            
            menu.add_cascade(label = "文件", menu = set_path)
            
            about = Menu(menu, tearoff = 0)
            about.add_command(label = "版本", accelerator = "v1.0.0")
            about.add_command(label = "作者", accelerator = "样子")
            menu.add_cascade(label = "关于", menu = about)
            
            self.progressbar = loadingDialog.progressbar()
            # 设置队列,保存查找完毕标志
            self.queue = queue.Queue()
            # 开始监听进度条
            self.listen_progressBar()
            
            self.window.bind("<Control-Key-f>", lambda event: self.open_dir())
            self.window.bind("<Control-Key-r>", lambda event: self.search_file())
            self.window.protocol("WM_DELETE_WINDOW", self.call_close_window)
            self.window.mainloop()
    
    class Application(Application_UI):
        def __init__(self):
            Application_UI.__init__(self)
            
            
        def call_close_window(self):
            self.progressbar.exit_()
            self.window.destroy()
        
        ''' 监听进度条'''
        def listen_progressBar(self):
            # 窗口每隔一段时间执行一个函数
            self.window.after(400, self.listen_progressBar)
            while not self.queue.empty():
                queue_data = self.queue.get()
                if queue_data == 1:
                    # 关闭进度条
                    self.progressbar.exit_()
                    self.is_start = 0
        
        ''' 设置默认搜索路径'''
        def open_dir(self):
            path = filedialog.askdirectory(title = u"设置目录", initialdir = self.search_path)
            print("设置路径:"+path)
            self.search_path = path
        
        ''' 开始搜索'''
        def search_file(self):
            def scan(self, keyword):
                # 清空表格数据
                for _ in map(self.treeView.delete, self.treeView.get_children()):
                    pass
                
                # 筛选文件
                self.find_file_insert(keyword)
                    
                # 设置查找完毕标志
                self.queue.put(1)
            
            if self.is_start == 0:
                # 获取查找关键词
                keyword = str.strip(self.search_val.get())
                if not keyword:
                    messagebox.showerror("提示", "请输入文件名称")
                    self.search_val.set("")
                    return
                
                # 设置已经开始查找状态
                self.is_start = 1
                # 开启线程
                self.thread = Thread(target = scan, args = (self, keyword))
                self.thread.setDaemon(True)
                self.thread.start()
                
                 # 显示进度条
                self.progressbar.start()
            else:
                pass
            
        
        ''' 查找设置目录下所有文件并插入表格'''
        def find_file_insert(self, keyword):
            try:
                for root, dirs, files in os.walk(self.search_path, topdown = True):
                    for file in files:
                        match_result = self.file_match(file, keyword)
                        if match_result is True: 
                            file_path = os.path.join(root, file)
                            # 插入数据到表格
                            self.treeView.insert('', END, values = (file, file_path))
                            # 更新表格
                            self.treeView.update()
            except Exception as e:
                print(e)
            
            return True
        
        ''' 名称匹配'''
        def file_match(self, file, keyword):
            print("文件匹配:",keyword, file)
            result = re.search(r'(.*)'+keyword+'(.*)', file, re.I)
            if result:
                return True
            return False
        
    if __name__ == "__main__":
        Application()
    

    loadingDialog.py

    。。。

    有需要这个文件的可以评论联系我哦

     有兴趣的可以做磁盘文件内容查找功能:

    1、获取磁盘下所有文件

    2、打开文件进行正则查找,找到匹配的放入一个列表

    3、用TreeView展示文件地址等信息

  • 相关阅读:
    动态页面技术(JSP/EL/JSTL)
    JavaWeb核心之Servlet
    会话技术Cookie&Session
    待整理
    二进制中1的个数(python)
    矩形覆盖(python)
    变态跳台阶(python)
    跳台阶(python)
    斐波那契数列(python)
    旋转数组的最小数字(python/c++)
  • 原文地址:https://www.cnblogs.com/yang-2018/p/11842843.html
Copyright © 2011-2022 走看看