{"id":312373,"date":"2020-11-01T03:00:15","date_gmt":"2020-11-01T03:00:15","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=312373"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=312373","title":{"rendered":"\u0424\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043d\u0430 \u043f\u0438\u0442\u043e\u043d\u0435 \u0432 430 \u0441\u0442\u0440\u043e\u043a \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u0438 \u0447\u0430\u0439\u043d\u0438\u043a\u043e\u0432"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!<\/p>\n<p>  \u042f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u043e\u0431\u043e\u0431\u0449\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u043f\u0438\u0442\u043e\u043d\u0430 \u0438 \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0434\u043b\u044f \u043f\u043a.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gj\/a5\/fe\/gja5fe26-gesxu7adt0gnbu9oz8.png\"\/><\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u042d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0438\u0433\u0440\u0443\u0448\u043a\u0430 \u0438 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435, \u044d\u0442\u043e \u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u041e\u0421!  <\/div>\n<\/p><\/div>\n<p>  \u0418\u043c\u043f\u043e\u0440\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a:<\/p>\n<pre><code class=\"python\">import tkinter import os import subprocess from tkinter import messagebox from tkinter import simpledialog <\/code><\/pre>\n<p><a name=\"habracut\"><\/a><br \/>  \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043c\u0435\u043d\u044e:<\/p>\n<pre><code class=\"python\">class MainContextMenu(tkinter.Menu): \t''' \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438''' \tdef __init__(self, main_window, parent): \t\tsuper(MainContextMenu, self).__init__(parent, tearoff = 0) \t\tself.main_window = main_window \t\tself.add_command(label=&quot;\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e&quot;, command = self.create_dir) \t\tself.add_command(label=&quot;\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b&quot;, command = self.create_file)  \tdef popup_menu(self, event): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e''' \t\t#\u0435\u0441\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u043d\u044e - \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0445 \t\tif self.main_window.file_context_menu: \t\t\tself.main_window.file_context_menu.unpost() \t\tif self.main_window.dir_context_menu: \t\t\tself.main_window.dir_context_menu.unpost() \t\tself.post(event.x_root, event.y_root)  \tdef create_dir(self): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439''' \t\tdir_name = simpledialog.askstring(&quot;\u041d\u043e\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f&quot;, &quot;\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438&quot;) \t\tif dir_name: \t\t\tcommand = &quot;mkdir {0}&quot;.format(dir_name).split(' ') \t\t\t#\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \t\t\tprocess = subprocess.Popen(command, cwd=self.main_window.path_text.get(), stdout = subprocess.PIPE, stderr = subprocess.PIPE) \t\t\tout, err = process.communicate() \t\t\t#\u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \t\t\tif err: \t\t\t\tmessagebox.showwarning(&quot;\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430!&quot;,&quot;\u041e\u0442\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0435.&quot;) \t\t\tself.main_window.refresh_window()   \tdef create_file(self): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438''' \t\tdir_name = simpledialog.askstring(&quot;\u041d\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b&quot;, &quot;\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430&quot;) \t\tif dir_name: \t\t\tcommand = &quot;touch {0}&quot;.format(dir_name).split(' ') \t\t\t#\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \t\t\tprocess = subprocess.Popen(command, cwd=self.main_window.path_text.get(), stdout = subprocess.PIPE, stderr = subprocess.PIPE) \t\t\tout, err = process.communicate() \t\t\t#\u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \t\t\tif err: \t\t\t\tmessagebox.showwarning(&quot;\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430!&quot;,&quot;\u041e\u0442\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0435.&quot;) \t\t\tself.main_window.refresh_window()    \tdef insert_to_dir(self): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u0438\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0432 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e''' \t\tcopy_obj = self.main_window.buff \t\tto_dir = self.main_window.path_text.get() \t\tif os.path.isdir(self.main_window.buff): \t\t\t#\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \t\t\tprocess = subprocess.Popen(['cp', '-r', copy_obj, to_dir], stdout = subprocess.PIPE, stderr = subprocess.PIPE) \t\t\tout, err = process.communicate() \t\t\tif err: \t\t\t\tmessagebox.showwarning(&quot;\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430!&quot;, err.decode(&quot;utf-8&quot;)) \t\telse: \t\t\t#\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \t\t\tprocess = subprocess.Popen(['cp', '-n', copy_obj, to_dir], stdout = subprocess.PIPE, stderr = subprocess.PIPE) \t\t\tout, err = process.communicate() \t\t\t#\u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \t\t\tif err: \t\t\t\tmessagebox.showwarning(&quot;\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430!&quot;,err.decode(&quot;utf-8&quot;)) \t\tself.main_window.refresh_window() <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u0444\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u043d\u043e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_-\/ou\/pm\/_-oupmyacexttxdvfusxt-lr6ti.png\" alt=\"image\"\/><\/p>\n<pre><code class=\"python\">class FileContextMenu(tkinter.Menu): \tdef __init__(self, main_window, parent): \t\tsuper(FileContextMenu, self).__init__(parent, tearoff = 0) \t\tself.main_window = main_window \t\tself.add_command(label=&quot;\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b&quot;, command = self.open_file) \t\tself.add_separator() \t\tself.add_command(label=&quot;\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c&quot;, command = self.copy_file) \t\tself.add_command(label=&quot;\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c&quot;, command = self.rename_file) \t\tself.add_separator() \t\tself.add_command(label=&quot;\u0423\u0434\u0430\u043b\u0438\u0442\u044c&quot;, command = self.delete_file)   \tdef open_file(self): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438''' \t\text = self.main_window.take_extention_file(self.main_window.selected_file) \t\tfull_path = self.main_window.path_text.get() + self.main_window.selected_file  \t\tif ext in ['txt', 'py', 'html', 'css', 'js']: \t\t\tif 'mousepad' in self.main_window.all_program: \t\t\t\tsubprocess.Popen([&quot;mousepad&quot;, full_path], start_new_session = True) \t\t\telse: \t\t\t\tself.problem_message() \t\telif ext == 'pdf': \t\t\tif 'evince' in self.main_window.all_program: \t\t\t\tsubprocess.run([&quot;evince&quot;, full_path], start_new_session = True) \t\t\telse: \t\t\t\tself.problem_message() \t\telif ext in ['png', 'jpeg', 'jpg', 'gif']: \t\t\tif 'ristretto' in self.main_window.all_program: \t\t\t\tsubprocess.run([&quot;ristretto&quot;, full_path], start_new_session = True) \t\t\telse: \t\t\t\tself.problem_message() \t\telse: \t\t\tself.problem_message()  \tdef problem_message(self): \t\tmessagebox.showwarning(&quot;\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0444\u0430\u0439\u043b\u0430&quot;, '\u041f\u0440\u043e\u0441\u0442\u0438, \u043d\u043e \u044f \u043d\u0435 \u043c\u043e\u0433\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b')  \tdef copy_file(self): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430''' \t\t#\u0437\u0430\u043d\u043e\u0441\u0438\u043c \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0432 \u0431\u0443\u0444\u0444\u0435\u0440 \t\tself.main_window.buff = self.main_window.path_text.get() + self.main_window.selected_file \t\tself.main_window.refresh_window()   \tdef delete_file(self): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430''' \t\tfull_path = self.main_window.path_text.get() + self.main_window.selected_file \t\t#\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \t\tprocess = subprocess.Popen(['rm', full_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE) \t\toutput, err = process.communicate() \t\t#\u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \t\tif err: \t\t\tmessagebox.showwarning(&quot;\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430&quot;, '\u0423 \u0412\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u0430\u0432 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430') \t\tself.main_window.refresh_window()  \tdef rename_file(self): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430''' \t\tnew_name = simpledialog.askstring(&quot;\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430&quot;, &quot;\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430&quot;) \t\tif new_name: \t\t\told_file = self.main_window.path_text.get() + self.main_window.selected_file \t\t\tnew_file = self.main_window.path_text.get() + new_name \t\t\t#\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \t\t\tprocess = subprocess.Popen(['mv', old_file, new_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE) \t\t\toutput, err = process.communicate() \t\t\t#\u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \t\t\tif err: \t\t\t\tmessagebox.showwarning(&quot;\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430&quot;, '\u0423 \u0412\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u0430\u0432 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430') \t\t\tself.main_window.refresh_window()  \tdef popup_menu(self, event): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e''' \t\tself.post(event.x_root, event.y_root) \t\t#\u0435\u0441\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u043d\u044e - \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0445 \t\tif self.main_window.main_context_menu: \t\t\tself.main_window.main_context_menu.unpost() \t\tif self.main_window.dir_context_menu: \t\t\tself.main_window.dir_context_menu.unpost() \t\tself.main_window.selected_file = event.widget[&quot;text&quot;]  <\/code><\/pre>\n<p>  \u0422\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0434\u043b\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438:<\/p>\n<pre><code class=\"python\">class DirContextMenu(tkinter.Menu): \tdef __init__(self, main_window, parent): \t\tsuper(DirContextMenu, self).__init__(parent, tearoff = 0) \t\tself.main_window = main_window \t\tself.add_command(label=&quot;\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c&quot;, command = self.rename_dir) \t\tself.add_command(label=&quot;\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c&quot;, command = self.copy_dir) \t\tself.add_separator() \t\tself.add_command(label=&quot;\u0423\u0434\u0430\u043b\u0438\u0442\u044c&quot;, command = self.delete_dir)  \tdef copy_dir(self): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438''' \t\tself.main_window.buff = self.main_window.path_text.get() + self.main_window.selected_file \t\tself.main_window.refresh_window()   \tdef delete_dir(self): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438''' \t\tfull_path = self.main_window.path_text.get() + self.main_window.selected_file \t\tif os.path.isdir(full_path): \t\t\t#\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \t\t\tprocess = subprocess.Popen(['rm', '-rf', full_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE) \t\t\toutput, err = process.communicate() \t\t\t#\u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \t\t\tif err: \t\t\t\tmessagebox.showwarning(&quot;\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438&quot;, '\u0423 \u0412\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u0430\u0432 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438') \t\tself.main_window.refresh_window()  \tdef rename_dir(self): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438''' \t\tnew_name = simpledialog.askstring(&quot;\u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438&quot;, &quot;\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438&quot;) \t\tif new_name: \t\t\told_dir = self.main_window.path_text.get() + self.main_window.selected_file \t\t\tnew_dir = self.main_window.path_text.get() + new_name \t\t\t#\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \t\t\tprocess = subprocess.Popen(['mv', old_dir, new_dir], stdout=subprocess.PIPE, stderr=subprocess.PIPE) \t\t\toutput, err = process.communicate() \t\t\t#\u043f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \t\t\tif err: \t\t\t\tmessagebox.showwarning(&quot;\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438&quot;, '\u0423 \u0412\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u0430\u0432 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438') \t\t\tself.main_window.refresh_window()  \tdef popup_menu(self, event): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e''' \t\tself.post(event.x_root, event.y_root) \t\t#\u0435\u0441\u043b\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u044b \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0435\u043d\u044e - \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u043c \u0438\u0445 \t\tif self.main_window.main_context_menu: \t\t\tself.main_window.main_context_menu.unpost() \t\tif self.main_window.file_context_menu: \t\t\tself.main_window.file_context_menu.unpost() \t\tself.main_window.selected_file = event.widget[&quot;text&quot;]  <\/code><\/pre>\n<p>  \u041a\u043b\u0430\u0441\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430:<\/p>\n<pre><code class=\"python\"> class MainWindow(): \t''' \u041a\u043b\u0430\u0441\u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430''' \tdef __init__(self): \t\tself.root = tkinter.Tk() \t\tself.root.title(&quot;FileManager&quot;) \t\tself.root.resizable(width = False, height = False) \t\tself.root.geometry('450x300')  \t\tself.hidden_dir = tkinter.IntVar() \t\tself.buff = None \t\tself.all_program = os.listdir('C:\/')  \t\tself.root.bind('&lt;Button-1&gt;', self.root_click) \t\tself.root.bind('&lt;FocusOut&gt;', self.root_click)  \t\t#top frame \t\tself.title_frame = tkinter.Frame(self.root) \t\tself.title_frame.pack(fill = 'both', expand = True)  \t\t#back button \t\tself.back_button = tkinter.Button(self.title_frame, text = &quot;..&quot;, command = self.parent_dir, width = 1, height = 1) \t\tself.back_button.pack(side = 'left')  \t\t#path entry \t\tself.path_text = tkinter.StringVar() \t\tself.path_text.set('\/') \t\tself.current_path = tkinter.Entry(self.title_frame, textvariable = self.path_text, width = 40, state='readonly') \t\tself.current_path.pack(side = 'left')  \t\t#button show\/hidde hidden dir\/file \t\tself.check_button = tkinter.Checkbutton(self.title_frame, text = &quot;Hidden&quot;, font = (&quot;Helvetica&quot;, 10), padx = 1, pady = 1, variable = self.hidden_dir, command = self.refresh_window) \t\tself.check_button.pack(side = 'left')  \t\t#main frame \t\tself.main_frame = tkinter.Frame(self.root) \t\tself.main_frame.pack()  \t\t# scroll bar \t\tself.scrollbar_vert = tkinter.Scrollbar(self.main_frame, orient=&quot;vertical&quot;) \t\tself.scrollbar_vert.pack(side = 'right', fill = 'y')  \t\tself.scrollbar_hor = tkinter.Scrollbar(self.main_frame, orient=&quot;horizontal&quot;) \t\tself.scrollbar_hor.pack(side = 'bottom', fill = 'x')  \t\t#canvas \t\tself.canvas = tkinter.Canvas(self.main_frame, borderwidth=0,  bg = 'white') \t\tself.inner_frame = tkinter.Frame(self.canvas,  bg = 'white')  \t\t#\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \t\tself.scrollbar_vert[&quot;command&quot;] = self.canvas.yview \t\tself.scrollbar_hor[&quot;command&quot;] = self.canvas.xview  \t\t#\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f canvas \t\tself.canvas.configure(yscrollcommand=self.scrollbar_vert.set, xscrollcommand = self.scrollbar_hor.set, width=400, heigh=250)  \t\tself.canvas.pack(side='left', fill='both', expand=True) \t\tself.canvas.create_window((0,0), window=self.inner_frame, anchor=&quot;nw&quot;)   \t\t#\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043b\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \t\tself.dir_content()   \tdef root_click(self, event): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043a\u043b\u0438\u043a\u0430 \u0432 root''' \t\t#\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0435 \u043c\u0435\u043d\u044e - \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u043c \t\tif self.file_context_menu: \t\t\tself.file_context_menu.unpost() \t\tif self.main_context_menu: \t\t\tself.main_context_menu.unpost() \t\tif self.dir_context_menu: \t\t\tself.dir_context_menu.unpost()  \tdef dir_content(self): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438''' \t\t#\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \t\tdir_list = os.listdir(self.path_text.get()) \t\tpath = self.path_text.get()  \t\tif not dir_list: \t\t\t#\u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \t\t\tself.main_context_menu = MainContextMenu(self, self.canvas) \t\t\tself.canvas.bind('&lt;Button-3&gt;', self.main_context_menu.popup_menu) \t\t\tif self.buff: \t\t\t\tself.main_context_menu.add_command(label=&quot;\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c&quot;, command = self.main_context_menu.insert_to_dir) \t\t\tself.inner_frame.bind('&lt;Button-3&gt;', self.main_context_menu.popup_menu) \t\t\t#\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \t\t\tself.file_context_menu = None \t\t\t#\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \t\t\tself.dir_context_menu = None \t\t\treturn None  \t\t#\u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \t\tself.main_context_menu = MainContextMenu(self, self.canvas) \t\tself.canvas.bind('&lt;Button-3&gt;', self.main_context_menu.popup_menu) \t\tif self.buff: \t\t\tself.main_context_menu.add_command(label=&quot;\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c&quot;, command = self.main_context_menu.insert_to_dir) \t\t#\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \t\tself.file_context_menu = FileContextMenu(self, self.inner_frame) \t\t#\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0435 \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \t\tself.dir_context_menu = DirContextMenu(self, self.inner_frame)   \t\ti = 0 \t\tfor item in dir_list:  \t\t\tif os.path.isdir(str(path) + item): \t\t\t\t#\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \t\t\t\tif os.access(str(path) + item, os.R_OK): \t\t\t\t\tif (not self.hidden_dir.get() and  not item.startswith('.')) or self.hidden_dir.get(): \t\t\t\t\t\tphoto = tkinter.PhotoImage(file =&quot;img\/folder.png&quot;)  \t\t\t\t\t\ticon = tkinter.Label(self.inner_frame, image=photo,  bg = 'white') \t\t\t\t\t\ticon.image = photo \t\t\t\t\t\ticon.grid(row=i+1, column=0)  \t\t\t\t\t\tfolder_name = tkinter.Label(self.inner_frame, text=item,  bg = 'white', cursor = 'hand1') \t\t\t\t\t\tfolder_name.bind(&quot;&lt;Button-1&gt;&quot;, self.move_to_dir) \t\t\t\t\t\tfolder_name.bind(&quot;&lt;Button-3&gt;&quot;, self.dir_context_menu.popup_menu) \t\t\t\t\t\tfolder_name.grid(row=i+1, column=1, sticky='w') \t\t\t\telse: \t\t\t\t\tif (not self.hidden_dir.get() and not item.startswith('.')) or self.hidden_dir.get(): \t\t\t\t\t\tphoto = tkinter.PhotoImage(file =&quot;img\/folder_access.png&quot;)  \t\t\t\t\t\ticon = tkinter.Label(self.inner_frame, image=photo,  bg = 'white') \t\t\t\t\t\ticon.image = photo \t\t\t\t\t\ticon.grid(row=i+1, column=0)  \t\t\t\t\t\tfolder_name = tkinter.Label(self.inner_frame, text=item,  bg = 'white') \t\t\t\t\t\tfolder_name.bind(&quot;&lt;Button-1&gt;&quot;, self.move_to_dir) \t\t\t\t\t\tfolder_name.grid(row=i+1, column=1, sticky='w')  \t\t\telse: \t\t\t\t#\u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b \t\t\t\tif (not self.hidden_dir.get() and not item.startswith('.')) or self.hidden_dir.get(): \t\t\t\t\text = self.take_extention_file(item) \t\t\t\t\t#\u0444\u043e\u0442\u043e, \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \t\t\t\t\tif ext in ['jpeg', 'jpg', 'png', 'gif']: \t\t\t\t\t\tphoto = tkinter.PhotoImage(file =&quot;img\/photo.png&quot;)  \t\t\t\t\t\ticon = tkinter.Label(self.inner_frame, image=photo,  bg = 'white') \t\t\t\t\t\ticon.image = photo \t\t\t\t\t\ticon.grid(row=i+1, column=0)  \t\t\t\t\t\tfile_name = tkinter.Label(self.inner_frame, text=item,  bg = 'white') \t\t\t\t\t\tfile_name.grid(row=i+1, column=1, sticky='w')  \t\t\t\t\t\tfile_name.bind(&quot;&lt;Button-3&gt;&quot;, self.file_context_menu.popup_menu) \t\t\t\t\telse: \t\t\t\t\t\t#\u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \t\t\t\t\t\tif os.access(str(path) + item, os.R_OK): \t\t\t\t\t\t\tphoto = tkinter.PhotoImage(file =&quot;img\/file.png&quot;)  \t\t\t\t\t\t\ticon = tkinter.Label(self.inner_frame, image=photo,  bg = 'white') \t\t\t\t\t\t\ticon.image = photo \t\t\t\t\t\t\ticon.grid(row=i+1, column=0)  \t\t\t\t\t\t\tfolder_name = tkinter.Label(self.inner_frame, text=item,  bg = 'white') \t\t\t\t\t\t\tfolder_name.grid(row=i+1, column=1, sticky='w')  \t\t\t\t\t\t\tfolder_name.bind(&quot;&lt;Button-3&gt;&quot;, self.file_context_menu.popup_menu)  \t\t\t\t\t\telse: \t\t\t\t\t\t\tphoto = tkinter.PhotoImage(file =&quot;img\/file_access.png&quot;)  \t\t\t\t\t\t\ticon = tkinter.Label(self.inner_frame, image=photo,  bg = 'white') \t\t\t\t\t\t\ticon.image = photo \t\t\t\t\t\t\ticon.grid(row=i+1, column=0)  \t\t\t\t\t\t\tfolder_name = tkinter.Label(self.inner_frame, text=item,  bg = 'white') \t\t\t\t\t\t\tfolder_name.grid(row=i+1, column=1, sticky='w') \t\t\ti += 1 \t\t#\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c inner_frame \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \t\tself.inner_frame.update() \t\tself.canvas.configure(scrollregion=self.canvas.bbox(&quot;all&quot;))  \tdef move_to_dir(self, event): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e''' \t\telem = event.widget \t\tdir_name = elem[&quot;text&quot;] \t\tfool_path = self.path_text.get() + dir_name \t\tif os.path.isdir(fool_path) and os.access(fool_path, os.R_OK): \t\t\told_path = self.path_text.get() \t\t\tself.path_text.set(old_path + dir_name + '\/') \t\t\tself.root_click('&lt;Button-1&gt;') \t\t\tself.refresh_window()   \tdef parent_dir(self): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e''' \t\told_path = [i for i in self.path_text.get().split('\/') if i] \t\tnew_path = '\/'+'\/'.join(old_path[:-1]) \t\tif not new_path: \t\t\tnew_path = '\/' \t\tif os.path.isdir(new_path): \t\t\tif new_path == '\/': \t\t\t\tself.path_text.set(new_path)  \t\t\telse: \t\t\t\tself.path_text.set(new_path + '\/') \t\t\tself.refresh_window()   \tdef take_extention_file(self, file_name): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430''' \t\tls = file_name.split('.') \t\tif len(ls)&gt;1: \t\t\treturn ls[-1] \t\telse: \t\t\treturn None  \tdef refresh_window(self): \t\t''' \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439\/\u0444\u0430\u0439\u043b\u043e\u0432''' \t\tfor widget in self.inner_frame.winfo_children(): \t\t\t\twidget.destroy() \t\tself.dir_content() \t\tself.canvas.yview_moveto(0) <\/code><\/pre>\n<p>  \u0418 \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u043a\u043d\u0430 \u0438 \u0437\u0430\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u0432\u0438\u0434\u0436\u0435\u0442\u043e\u0432:<\/p>\n<pre><code class=\"python\">win = MainWindow() win.root.mainloop() <\/code><\/pre>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0424\u0430\u0439\u043b\u044b, \u0430\u0441\u0441\u0435\u0442\u044b, \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u0437\u0434\u0435\u0441\u044c<\/b>                         <\/p>\n<div class=\"spoiler_text\"><a href=\"https:\/\/yadi.sk\/d\/0A8TnoazXMk1qg\" rel=\"nofollow\">yadi.sk\/d\/0A8TnoazXMk1qg<\/a>  <\/div>\n<\/p><\/div>\n<p>  \u0411\u0443\u0434\u0443 \u0440\u0430\u0434, \u0435\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u0435\u0441\u044c \u0441\u043e \u043c\u043d\u043e\u0439 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b!<br \/>  \u041f\u0438\u0448\u0438\u0442\u0435: ki1killer@yandex.ru<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/525976\/\"> https:\/\/habr.com\/ru\/post\/525976\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\">\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!<\/p>\n<p>  \u042f \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u043e\u0431\u043e\u0431\u0449\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u043f\u0438\u0442\u043e\u043d\u0430 \u0438 \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0434\u043b\u044f \u043f\u043a.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gj\/a5\/fe\/gja5fe26-gesxu7adt0gnbu9oz8.png\"\/><\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/b>                         <\/p>\n<div class=\"spoiler_text\">\u042d\u0442\u043e \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0438\u0433\u0440\u0443\u0448\u043a\u0430 \u0438 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435, \u044d\u0442\u043e \u043d\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u041e\u0421!  <\/div>\n<\/p><\/div>\n<p>  \u0418\u043c\u043f\u043e\u0440\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a:<\/p>\n<pre><code class=\"python\">import tkinter import os import subprocess from tkinter import messagebox from tkinter import simpledialog <\/code><\/pre>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-312373","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/312373","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=312373"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/312373\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=312373"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=312373"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=312373"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}