Advertisement
jimbob88

Untitled

Mar 29th, 2020
384
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.40 KB | None | 0 0
  1. try:
  2.     import tkinter as tk
  3.     import tkinter.ttk as ttk
  4. except:
  5.     import Tkinter as tk
  6.     import ttk
  7. import os
  8. import sys
  9. import platform
  10. import stat
  11. import time
  12. import mmap
  13.  
  14. try:
  15.     import ttkthemes
  16. except:
  17.     pass
  18.  
  19. try:
  20.     import scandir_rs
  21. except:
  22.     pass
  23.  
  24. from custom_treeview import ScrolledTreeView
  25. from benedict import benedict
  26.  
  27. def os_walk_search(search_loc, search_var):
  28.     files = []
  29.     for root, directories, filenames in os.walk(search_loc):
  30.         for filename in filenames:
  31.             if search_var in filename:
  32.                 files.append(os.path.join(root, filename))
  33.     return files
  34.  
  35.  
  36. def scandir_rs_search(search_loc, search_var):
  37.     files = []
  38.     for root, directories, filenames in scandir_rs.walk.Walk(search_loc):
  39.         # if any([search_var in filename for filename in filenames]):
  40.         for filename in filenames:
  41.             if search_var in filename:
  42.                 files.append(os.path.join(root, filename))
  43.     return files
  44.  
  45.  
  46. def windows_cmd_search(search_loc, search_var):
  47.     os.system(
  48.         r"dir /s/b {search} > files.txt".format(
  49.             search=os.path.join(search_loc, "*{file}*".format(file=search_var),)
  50.         )
  51.     )
  52.     with open("files.txt", "r") as f:
  53.         return f.read().splitlines()
  54.  
  55. def linux_cmd_search(search_var, search_loc):
  56.     os.system(
  57.         'find {location} -name "*{search_term}*" > ./files.txt'.format(
  58.             location=search_loc, search_term=search_var,
  59.         )
  60.     )
  61.     with open("files.txt", "r") as f:
  62.         return f.read().splitlines()
  63.  
  64.  
  65. def not_darwin_search(search_loc, search_var):
  66.     if platform.system() == "Linux":
  67.         return linux_cmd_search(search_loc, search_var)
  68.     else:
  69.         if "scandir_rs" in sys.modules:
  70.             return scandir_rs_search(search_loc, search_var)
  71.         else:
  72.             return windows_cmd_search(search_loc, search_var)
  73.  
  74.  
  75. def file_counter_win(top_master):
  76.     prog_win = tk.Toplevel(master=top_master)
  77.     prog_win.title("Progress")
  78.     prog_win.resizable(False, False)
  79.     if platform.system() == "Linux":
  80.         prog_win.wm_attributes("-type", "splash")
  81.     else:
  82.         prog_win.overrideredirect(1)
  83.     prog_win.attributes("-topmost", True)
  84.     prog_win.geometry(
  85.         "150x22+{:.0f}+{:.0f}".format(
  86.             top_master.winfo_x() + (top_master.winfo_width()) - 150,
  87.             top_master.winfo_y() + (top_master.winfo_height()) - 22,
  88.         )
  89.     )
  90.     return prog_win
  91.  
  92. class file_walker:
  93.     def __init__(self, master):
  94.         self.master = master
  95.         self.master.title("Onion Search")
  96.  
  97.         self.menubar = tk.Menu(self.master)
  98.         self.master.configure(menu=self.menubar)
  99.         self.filemenu = tk.Menu(self.menubar, tearoff=0)
  100.         self.show_prog = tk.BooleanVar()
  101.         self.filemenu.add_checkbutton(label="Show Progress", variable=self.show_prog)
  102.         self.inside_search_files = []
  103.         self.search_inside_var = tk.BooleanVar()
  104.         self.filemenu.add_checkbutton(
  105.             label="Search Inside TextFiles", variable=self.search_inside_var
  106.         )
  107.         self.menubar.add_cascade(label="File", menu=self.filemenu)
  108.  
  109.         self.search_loc = tk.StringVar()
  110.         self.search_loc.set(os.path.expanduser("~"))
  111.         ttk.Combobox(
  112.             self.master,
  113.             values=(os.path.expanduser("~"),),
  114.             textvariable=self.search_loc,
  115.             justify="center",
  116.         ).grid(row=0, column=0, sticky="ns")
  117.  
  118.         self.search_var = tk.StringVar()
  119.         self.search_bar = ttk.Entry(self.master, textvariable=self.search_var)
  120.         self.search_bar.grid(row=0, column=1, sticky="nsew")
  121.  
  122.         self.search_vew = ScrolledTreeView(self.master)
  123.         self.search_vew.grid(row=1, column=0, columnspan=3, sticky="nsew")
  124.  
  125.         self.search_vew.heading("#0", text="File")
  126.         self.search_vew["columns"] = ("fullpath", "type", "size", "Last Access")
  127.         self.search_vew["displaycolumns"] = ("size", "Last Access")
  128.         for col in self.search_vew["columns"]:
  129.             self.search_vew.heading(col, text=col[0].upper() + col[1:])
  130.  
  131.         self.master.grid_rowconfigure(1, weight=1)
  132.         self.master.grid_columnconfigure(1, weight=1)
  133.  
  134.         self.search_but = ttk.Button(self.master, text="Search", command=self.search)
  135.         self.search_but.grid(row=0, column=2)
  136.  
  137.         # self.master.bind("<<TreeviewOpen>>", self.update_tree)
  138.  
  139.         self.files = []
  140.  
  141.     def search(self, *args):
  142.         if not os.path.isdir(self.search_loc.get()):
  143.             return
  144.         if self.show_prog.get():
  145.             return self.search_win(self, *args)
  146.         self.search_but.configure(state="disabled")
  147.  
  148.         if platform.system() == "Darwin":
  149.             self.files = os_walk_search(self.search_loc.get(), self.search_var.get())
  150.         else:
  151.             self.files = not_darwin_search(self.search_loc.get(), self.search_var.get())
  152.  
  153.         if self.search_inside_var.get():
  154.             self.files += self.search_inside()
  155.  
  156.         self.search_vew.delete(*self.search_vew.get_children())
  157.         dir = os.path.abspath(self.search_loc.get())
  158.         node = self.search_vew.insert("", "end", text=dir, values=[dir, "directory"])
  159.         self.populate_tree()
  160.         self.search_but.configure(state="normal")
  161.  
  162.     def search_win(self, *args):
  163.         """
  164.        Search but with a counter for the number of currently found files
  165.        Tries to mimic the functionality of catfish but if you mimize onion_file_search it stays open, needs fixing
  166.        """
  167.  
  168.         prog_win = file_counter_win(self.master)
  169.  
  170.         curr_prog = ttk.Label(prog_win, text="Files Found: ")
  171.         curr_prog.grid(row=0, column=0, sticky="nsew")
  172.  
  173.         prog_win.grid_rowconfigure(0, weight=1)
  174.         prog_win.grid_columnconfigure(0, weight=1)
  175.  
  176.         self.search_but.configure(state="disabled")
  177.  
  178.         if platform.system() == "Darwin":
  179.             self.files = os_walk_search(self.search_loc.get(), self.search_var.get())
  180.         else:
  181.             self.files = not_darwin_search(self.search_loc.get(), self.search_var.get())
  182.  
  183.         for file_count, directory in enumerate(self.files):
  184.             if file_count % 100 == 1:
  185.                 curr_prog["text"] = "Files Found: {0}".format(file_count)
  186.                 curr_prog.update()
  187.             curr_prog["text"] = "Files Found: {0}".format(file_count)
  188.             curr_prog.update()
  189.  
  190.         if self.search_inside_var.get():
  191.             self.files += self.search_inside()
  192.  
  193.         self.search_vew.delete(*self.search_vew.get_children())
  194.         dir = os.path.abspath(self.search_loc.get())
  195.         node = self.search_vew.insert("", "end", text=dir, values=[dir, "directory"])
  196.         self.populate_tree()
  197.         self.search_vew.update()
  198.         self.search_but.configure(state="normal")
  199.  
  200.         self.master.after(1000, prog_win.destroy)
  201.  
  202.     def search_inside(self):
  203.         files = []
  204.         self.inside_search_files = []
  205.         if platform.system() == "Linux":
  206.             os.system(
  207.                 'grep -sRil "{text}" {location} > files.txt'.format(
  208.                     text=self.search_var.get(), location=self.search_loc.get()
  209.                 )
  210.             )
  211.         elif platform.system() == "Windows":
  212.             os.system(
  213.                 'findstr /s /m /p /i /c:"{text}" {location} > files.txt'.format(
  214.                     text=self.search_var.get(),
  215.                     location=os.path.join(self.search_loc.get(), "*"),
  216.                 )
  217.             )
  218.         with open("files.txt", "r") as f:
  219.             for line in f:
  220.                 files.append(os.path.dirname(line))
  221.                 self.inside_search_files.append(os.path.normpath(line.strip()))
  222.         return files
  223.  
  224.     # def populate_tree(self, tree, node):
  225.     #     if tree.set(node, "type") != "directory":
  226.     #         return
  227.     #     path = tree.set(node, "fullpath")
  228.     #     tree.delete(*tree.get_children(node))
  229.     #     parent = tree.parent(node)
  230.     #     for p in os.listdir(path):
  231.     #         ptype = None
  232.     #         p = os.path.join(path, p)
  233.     #         if os.path.isdir(p):
  234.     #             ptype = "directory"
  235.     #             if not any(p in substring for substring in self.files):
  236.     #                 continue
  237.     #         elif os.path.isfile(p):
  238.     #             ptype = "file"
  239.     #         fname = os.path.split(p)[1]
  240.     #         if ptype != "file":
  241.     #             id = tree.insert(node, "end", text=fname, values=[p, ptype])
  242.     #         else:
  243.     #             if self.search_var.get() in fname or p in self.inside_search_files:
  244.     #                 id = tree.insert(node, "end", text=fname, values=[p, ptype])
  245.     #             else:
  246.     #                 continue
  247.     #         if ptype == "directory":
  248.     #             tree.insert(id, 0, text="dummy")
  249.     #             tree.item(id, text=fname)
  250.     #         elif ptype == "file":
  251.     #             _stat = os.stat(p)
  252.     #             size = _stat.st_size
  253.     #             tree.set(id, "size", "%d bytes" % size)
  254.     #             modified = time.ctime(_stat[stat.ST_MTIME])
  255.     #             tree.set(id, "Last Access", modified)
  256.  
  257.     def populate_tree(self):
  258.         file_tree = benedict({})
  259.         for_merge = []
  260.         for file_path in self.files:
  261.             # prior_dirs = []
  262.             # for sect in file_path.split(os.sep):
  263.             #     prior_dirs.append(sect)
  264.             #     if prior_dirs not in file_tree:
  265.             #         file_tree['.'.join(prior_dirs).replace('[', '\\[').replace(']', '\\]')] = {}
  266.             for_merge.append(benedict(keypath_separator=os.sep))
  267.             print(file_path)
  268.             for_merge[-1][file_path.replace('[', '\\[').replace(']', '\\]')] = "file"
  269.         file_tree.merge(*for_merge)
  270.         print(file_tree.dump())
  271.  
  272.     # def update_tree(self, event):
  273.     #     tree = event.widget
  274.     #     self.populate_tree(tree, tree.focus())
  275.  
  276.  
  277. def main():
  278.     if "ttkthemes" in sys.modules:
  279.         root = ttkthemes.ThemedTk()
  280.         file_walker_gui = file_walker(root)
  281.  
  282.         if platform.system() == "Linux":
  283.             root.set_theme("equilux")
  284.         elif platform.system() == "Windows":
  285.             root.set_theme("vista")
  286.         elif platform.system() == "Darwin":
  287.             root.set_theme("aqua")
  288.         root.mainloop()
  289.     else:
  290.         root = tk.Tk()
  291.         file_walker_gui = file_walker(root)
  292.         root.mainloop()
  293.  
  294.  
  295. if __name__ == "__main__":
  296.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement