from tkinter import *
from tkinter import filedialog
import tkinter.ttk as ttk
from tkinter.ttk import Notebook
import subprocess
import re
import os
class Tree(Frame):
def __init__(self, parent, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
self.tree = ttk.Treeview(self, selectmode='browse')
self.tree.column('#0', minwidth=300, width=160, stretch='yes')
style=ttk.Style(self)
style.theme_use("clam")
style.configure("Treeview", background="gray", fieldbackground="darkgray", foreground="azure")
#self.tree.bind("<Double-1>", self.on_tree_double_clicked)
self.ysb = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
self.xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tree.xview)
self.tree.configure(yscroll=self.ysb.set)
self.tree.configure(xscroll=self.xsb.set)
self.tree.heading('#0', text='Текущий каталог', anchor='w')
self.xsb.pack(side = 'bottom', fill = 'x')
self.ysb.pack(side = 'right', fill = 'y')
self.tree.pack(side = 'left', fill = 'y')
self.path_dir = None
self.path_directory(self.path_dir)
def path_directory(self, path_dir):
path_dir = self.path_dir
if path_dir == None:
path = os.getcwd()
abspath = os.path.abspath(path)
dir_name = os.path.abspath(path).split('/')[-1]
root_node = self.tree.insert('', 'end', text=dir_name, open=True)
self.process_directory(root_node, abspath)
else:
self.process_directory(root_node, path_dir)
def process_directory(self, parent, path):
mylist = sorted(sorted(os.listdir(path)), key=lambda x: f"{x}.".split(".")[1]) #сортировать сначала всё, потом по расширению
results = [f for f in mylist if f.endswith(('.py', 'pyw', 'pyc'))]
for p in results:
abspath = os.path.join(path, p)
isdir = os.path.isdir(abspath)
oid = self.tree.insert(parent, 'end', text=p, open=False)
if isdir:
self.process_directory(oid, abspath)
def clear_tree(self):
self.tree.delete(*self.tree.get_children())
class Note(Notebook):
def __init__(self, parent, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
self.notebook = ttk.Notebook(self)
self.notebook.pack(side = 'right', fill = 'both', expand = True)
self.text_list = []
def add_tab(self, parent, contents, name):
text_num = Text()
self.text_list.append(text_num)
text = self.text_list[len(self.text_list) - 1]
parent.add(text_num, text=name)
text.insert('end', contents)
last_tab = self.notebook.tabs()
self.notebook.select(last_tab[-1])
class App(Tk):
def __init__(self, parent=None, *args, **kwargs):
super().__init__(parent, *args, **kwargs)
self.minsize(width = 500, height = 500)
self.treeview = Tree(self)
self.note = Note(self)
self.menu_bar = Menu(self)
self.file_menu = Menu(self.menu_bar, tearoff = 0)
self.menu_bar.add_cascade(label = 'Файл', menu = self.file_menu)
self.file_menu.add_command(label = 'Открыть', command = self.open_file)
self.config(menu = self.menu_bar)
self.treeview.tree.bind('<Double-1>', self.on_tree_double_clicked)
self.note.notebook.bind('<<NotebookTabChanged>>', self.sel_tab)
self.note.pack(side = 'right', fill = 'both', expand = True)
self.treeview.pack(side = 'left', fill = 'y')
self.style = ttk.Style()
self.style.configure('TNotebook.Tab', foreground = 'black')
def open_file(self):
file = filedialog.askopenfile(filetypes=[('Pyton file', '*.py'), ('Python files','*.pyw'), ('Python files', '*.pyc')])#в исходнике просто file
fname = file.name
print("file=", fname)
if file:
self.note.add_tab(self.note.notebook, file.read(), file.name.split('/')[-1])
print("fname1=", fname)
self.sel_tab(None, fname)
return fname
def open_file_clicked(self, path):
file_path = os.path.abspath(path)
with open(file_path, 'r') as f:
self.note.add_tab(self.note.notebook, f.read(), f.name.split('/')[-1])
def on_tree_double_clicked(self, event):
selected_items = self.treeview.tree.selection()
if not selected_items:
return
else:
item_iid = selected_items[0]
item_text = self.treeview.tree.item(item_iid, "text")
path = item_text
self.open_file_clicked(path)
def sel_tab(self, event, fname):
# name_tab = self.note.notebook.tab(self.note.notebook.select(), 'text')
# command = ['locate'+ ' ' + name_tab]
# output = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).communicate()[0]
# output = output.decode()
# search_results = output.split('\n')
# print("search_results=", search_results[0])
path_dir = os.path.dirname(fname)
print("path_dir=", type(path_dir))
self.treeview.clear_tree()
self.treeview.path_directory(path_dir)
if __name__ == '__main__':
app = App()
app.mainloop()