From 12970a8ca385943c07a8f7e712948a3c063eb1db Mon Sep 17 00:00:00 2001 From: Wintreist Date: Thu, 17 Aug 2023 15:09:29 +0300 Subject: [PATCH 1/8] GUI --- xgtf_to_excel/icon.png | Bin 0 -> 65352 bytes xgtf_to_excel/requirements.txt | Bin 268 -> 780 bytes xgtf_to_excel/untitled.ui | 135 +++++++++++++++++++++++++++++ xgtf_to_excel/xgtf_to_excel_gui.py | 87 +++++++++++++++++++ 4 files changed, 222 insertions(+) create mode 100644 xgtf_to_excel/icon.png create mode 100644 xgtf_to_excel/untitled.ui create mode 100644 xgtf_to_excel/xgtf_to_excel_gui.py diff --git a/xgtf_to_excel/icon.png b/xgtf_to_excel/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8c715c8b9469f8bc8c9df63340ccc8636e2da1ad GIT binary patch literal 65352 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 delta 29 lcmeBS>tSO0|8Js-+QbKHlRX&aCU-E(Om<^Rn|y*v4gjbC3V;9r diff --git a/xgtf_to_excel/untitled.ui b/xgtf_to_excel/untitled.ui new file mode 100644 index 0000000..eac9010 --- /dev/null +++ b/xgtf_to_excel/untitled.ui @@ -0,0 +1,135 @@ + + + MainWindow + + + + 0 + 0 + 750 + 250 + + + + + 750 + 250 + + + + Xgtf to Excel GUI + + + + + + + + + + + Выход из программы + + + + + + + Очистить поля + + + + + + + ... + + + + + + + Запустить + + + + + + + true + + + + + + + ... + + + + + + + true + + + + + + + Выберите директорию для файла с результатом + + + + + + + + + + .xlsx + + + + + + + Введите название файла с результатом + + + + + + + Выберите рабочую директорию + + + + + + + + + Открыть файл с результатом + + + + + + + + + + + 0 + 0 + 750 + 21 + + + + + + + + diff --git a/xgtf_to_excel/xgtf_to_excel_gui.py b/xgtf_to_excel/xgtf_to_excel_gui.py new file mode 100644 index 0000000..9018ef0 --- /dev/null +++ b/xgtf_to_excel/xgtf_to_excel_gui.py @@ -0,0 +1,87 @@ +import sys +import os +from functools import partial +import subprocess as sub +from PyQt6 import uic, QtGui, QtCore +from PyQt6.QtWidgets import QMainWindow, QApplication, QPushButton, QLineEdit, QFileDialog, QMessageBox, QProgressBar + + +class MainWindow(QMainWindow): + def __init__(self): + super(MainWindow, self).__init__() + uic.loadUi('untitled.ui', self) + + + # Определение виджетов + self.input_work_dir = self.findChild(QLineEdit, "input_work_dir") + self.input_result_dir = self.findChild(QLineEdit, "input_result_dir") + self.input_file_name = self.findChild(QLineEdit, "input_file_name") + + self.button_select_work_dir = self.findChild(QPushButton, "button_select_work_dir") + self.button_select_result_dir = self.findChild(QPushButton, "button_select_result_dir") + self.button_exit = self.findChild(QPushButton, "button_exit") + self.button_clear_input = self.findChild(QPushButton, "button_clear_input") + self.button_start = self.findChild(QPushButton, "button_start") + self.button_open_result_file = self.findChild(QPushButton, "button_open_result_file") + # ~~~~~~~~ + # Значения по умолчанию + self.set_default_value() + # ~~~~~~~~ + # Свойства + self.input_work_dir.setReadOnly(True) + self.input_result_dir.setReadOnly(True) + self.button_open_result_file.setVisible(False) + # ~~~~~~~~ + # Сигналы + self.button_select_work_dir.clicked.connect(partial(self.openFileExplorer, self.input_work_dir)) + self.button_select_result_dir.clicked.connect(partial(self.openFileExplorer, self.input_result_dir)) + self.button_exit.clicked.connect(self.close) + self.button_clear_input.clicked.connect(self.clear_all_inputs) + self.button_start.clicked.connect(self.start_program) + # ~~~~~~~~ + + self.show() + pass + + def openFileExplorer(self, input_directory:QLineEdit): + directory = QFileDialog.getExistingDirectory(self, "Выберите директорию") + if directory != '': + input_directory.setText(directory) + pass + + def set_default_value(self): + self.input_file_name.setText("result") + self.input_result_dir.setText(os.getcwd()) + pass + + def clear_all_inputs(self): + for input in self.findChildren(QLineEdit): + input.setText('') + self.set_default_value() + pass + + def start_program(self): + if self.input_work_dir.text() == '': + QMessageBox.critical(self, "Ошибка запуска", "Вы не ввели рабочую директорию!") + return False + if self.input_file_name.text() == '': + QMessageBox.critical(self, "Ошибка запуска", "Вы не ввели название файла с результатом!") + return False + work_dir = os.path.join(self.input_work_dir.text()) + result_dir = os.path.join(self.input_result_dir.text(), self.input_file_name.text()+".xlsx") + sub.run(['../venv/Scripts/python.exe', 'xgtf_to_excel.py', '--work-dir', work_dir, '--result-dir', result_dir]) + self.button_open_result_file.setVisible(True) + self.button_open_result_file.clicked.connect(partial(self.open_result_file, result_dir)) + pass + + def open_result_file(self, file_path:str): + os.system("start " + file_path) + pass + +if __name__ == '__main__': + file_path = os.path.realpath(__file__[:__file__.rfind("\\")]) + os.chdir(file_path) + app = QApplication(sys.argv) + app.setWindowIcon(QtGui.QIcon('icon.png')) + main_window = MainWindow() + app.exec() \ No newline at end of file From 9e0f49dace0b0537d561be92ae6279dc0cc3c27a Mon Sep 17 00:00:00 2001 From: Wintreist Date: Fri, 18 Aug 2023 10:29:41 +0300 Subject: [PATCH 2/8] GUI with progress bar --- .../__pycache__/xgtf_to_excel.cpython-310.pyc | Bin 0 -> 6656 bytes xgtf_to_excel/untitled.ui | 10 +++++ xgtf_to_excel/xgtf_to_excel.py | 41 ++++++++++++------ xgtf_to_excel/xgtf_to_excel_gui.py | 20 +++++++-- 4 files changed, 54 insertions(+), 17 deletions(-) create mode 100644 xgtf_to_excel/__pycache__/xgtf_to_excel.cpython-310.pyc diff --git a/xgtf_to_excel/__pycache__/xgtf_to_excel.cpython-310.pyc b/xgtf_to_excel/__pycache__/xgtf_to_excel.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..866b71d5bc8f72233445a22d0b6c98bacebe9b47 GIT binary patch literal 6656 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 literal 0 HcmV?d00001 diff --git a/xgtf_to_excel/untitled.ui b/xgtf_to_excel/untitled.ui index eac9010..b87b2f5 100644 --- a/xgtf_to_excel/untitled.ui +++ b/xgtf_to_excel/untitled.ui @@ -114,6 +114,16 @@ + + + + 0 + + + false + + + diff --git a/xgtf_to_excel/xgtf_to_excel.py b/xgtf_to_excel/xgtf_to_excel.py index 4737828..2b0c17a 100644 --- a/xgtf_to_excel/xgtf_to_excel.py +++ b/xgtf_to_excel/xgtf_to_excel.py @@ -7,6 +7,9 @@ from typing import Optional, Tuple from math import isnan from numpy import sum as npsum +from alive_progress import alive_it +from multiprocessing import Process, Pipe +from multiprocessing.connection import PipeConnection # Константы @@ -94,17 +97,14 @@ def append(self, element:XgtfData): pass pass - - -if __name__ == "__main__": - # Аргументы - parser = ArgumentParser() - parser.add_argument('--work-dir', required=True) - parser.add_argument('--result-dir',nargs="?", default='result.xlsx') - namespace = parser.parse_args() - # +def xgtf_to_excel_work(work_dir, result_dir = os.path.join(os.getcwd(), 'result.xlsx'), pipe:Optional[PipeConnection]=None): allData = AllXgtfData() - for file_name in os.listdir(namespace.work_dir): + bar = alive_it(os.listdir(work_dir)) if pipe is None else os.listdir(work_dir) + if pipe is not None: + pipe.send(len(bar)) + for file_name in bar: + if pipe is not None: + pipe.send(bar.index(file_name)) # Условие для обработки .xgtf if file_name.find(".xgtf") == -1: continue @@ -113,11 +113,11 @@ def append(self, element:XgtfData): data = XgtfData(file_name) try: - tree = ET.parse(os.path.join(namespace.work_dir, file_name)) + tree = ET.parse(os.path.join(work_dir, file_name)) except ET.ParseError: allData.append(data) continue - print(os.path.join(namespace.work_dir, file_name)) + print(os.path.join(work_dir, file_name)) root_data_sourcefile = tree.getroot().find(f'./{VIPER}data/{VIPER}sourcefile') # Количество рамок объектов @@ -140,7 +140,7 @@ def append(self, element:XgtfData): if data.framesCount == 0 or framerate == 0: raise AttributeError except AttributeError: - data.framesCount,framerate = get_fps_and_numframes_from_video(namespace.work_dir, file_name) + data.framesCount,framerate = get_fps_and_numframes_from_video(work_dir, file_name) if framerate != 0: # Расчет времени @@ -149,10 +149,12 @@ def append(self, element:XgtfData): # Сохраняем в общий массив allData.append(data) + if pipe is not None: + pipe.send(-1) # Вывод в файл df = pd.DataFrame(allData.to_excel(), columns=['Имя', 'Количество объектов', 'Длинна видео (секунд)', 'Длинна видео (кадры)', 'Среднее кол-во рамок объектов на кадре', 'Классы']) - writer = pd.ExcelWriter(namespace.result_dir, engine='xlsxwriter') + writer = pd.ExcelWriter(result_dir, engine='xlsxwriter') df.style.applymap(painting_errors).to_excel(writer, sheet_name='Sheet1', index=False, na_rep='NaN') for column in df: @@ -161,3 +163,14 @@ def append(self, element:XgtfData): writer.sheets['Sheet1'].set_column(col_idx, col_idx, column_length) writer.close() + + +if __name__ == "__main__": + # Аргументы + parser = ArgumentParser() + parser.add_argument('--work-dir', required=True) + parser.add_argument('--result-dir',nargs="?", default='result.xlsx') + namespace = parser.parse_args() + # + xgtf_to_excel_work(namespace.work_dir, namespace.result_dir) + diff --git a/xgtf_to_excel/xgtf_to_excel_gui.py b/xgtf_to_excel/xgtf_to_excel_gui.py index 9018ef0..76d7c39 100644 --- a/xgtf_to_excel/xgtf_to_excel_gui.py +++ b/xgtf_to_excel/xgtf_to_excel_gui.py @@ -4,6 +4,9 @@ import subprocess as sub from PyQt6 import uic, QtGui, QtCore from PyQt6.QtWidgets import QMainWindow, QApplication, QPushButton, QLineEdit, QFileDialog, QMessageBox, QProgressBar +from multiprocessing import Pipe, Process, Queue +from multiprocessing.connection import PipeConnection +from xgtf_to_excel import xgtf_to_excel_work class MainWindow(QMainWindow): @@ -23,6 +26,8 @@ def __init__(self): self.button_clear_input = self.findChild(QPushButton, "button_clear_input") self.button_start = self.findChild(QPushButton, "button_start") self.button_open_result_file = self.findChild(QPushButton, "button_open_result_file") + + self.progressBar = self.findChild(QProgressBar, "progressBar") # ~~~~~~~~ # Значения по умолчанию self.set_default_value() @@ -52,6 +57,8 @@ def openFileExplorer(self, input_directory:QLineEdit): def set_default_value(self): self.input_file_name.setText("result") self.input_result_dir.setText(os.getcwd()) + self.progressBar.setValue(0) + self.button_open_result_file.setVisible(False) pass def clear_all_inputs(self): @@ -69,7 +76,15 @@ def start_program(self): return False work_dir = os.path.join(self.input_work_dir.text()) result_dir = os.path.join(self.input_result_dir.text(), self.input_file_name.text()+".xlsx") - sub.run(['../venv/Scripts/python.exe', 'xgtf_to_excel.py', '--work-dir', work_dir, '--result-dir', result_dir]) + parent_conn, child_conn = Pipe() + script = Process(target=xgtf_to_excel_work, args=(work_dir, result_dir, child_conn)) + script.start() + all_len = parent_conn.recv() + data = parent_conn.recv() + while data != -1: + self.progressBar.setValue(int(data*100/all_len)) + data = parent_conn.recv() + self.progressBar.setValue(100) self.button_open_result_file.setVisible(True) self.button_open_result_file.clicked.connect(partial(self.open_result_file, result_dir)) pass @@ -79,8 +94,7 @@ def open_result_file(self, file_path:str): pass if __name__ == '__main__': - file_path = os.path.realpath(__file__[:__file__.rfind("\\")]) - os.chdir(file_path) + os.chdir(os.path.realpath(__file__[:__file__.rfind("\\")])) app = QApplication(sys.argv) app.setWindowIcon(QtGui.QIcon('icon.png')) main_window = MainWindow() From d5e97a0aea7ae780af93270d534ad7813d7eb560 Mon Sep 17 00:00:00 2001 From: Wintreist Date: Fri, 18 Aug 2023 11:32:00 +0300 Subject: [PATCH 3/8] =?UTF-8?q?=D0=BD=D0=B5=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xgtf_to_excel/xgtf_to_excel_gui.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/xgtf_to_excel/xgtf_to_excel_gui.py b/xgtf_to_excel/xgtf_to_excel_gui.py index 76d7c39..1df6349 100644 --- a/xgtf_to_excel/xgtf_to_excel_gui.py +++ b/xgtf_to_excel/xgtf_to_excel_gui.py @@ -2,10 +2,9 @@ import os from functools import partial import subprocess as sub -from PyQt6 import uic, QtGui, QtCore +from PyQt6 import uic, QtGui from PyQt6.QtWidgets import QMainWindow, QApplication, QPushButton, QLineEdit, QFileDialog, QMessageBox, QProgressBar -from multiprocessing import Pipe, Process, Queue -from multiprocessing.connection import PipeConnection +from multiprocessing import Pipe, Process from xgtf_to_excel import xgtf_to_excel_work @@ -68,29 +67,34 @@ def clear_all_inputs(self): pass def start_program(self): - if self.input_work_dir.text() == '': + if not self.input_work_dir.text(): QMessageBox.critical(self, "Ошибка запуска", "Вы не ввели рабочую директорию!") return False - if self.input_file_name.text() == '': + + if not self.input_file_name.text(): QMessageBox.critical(self, "Ошибка запуска", "Вы не ввели название файла с результатом!") return False + work_dir = os.path.join(self.input_work_dir.text()) - result_dir = os.path.join(self.input_result_dir.text(), self.input_file_name.text()+".xlsx") + result_dir = os.path.join(self.input_result_dir.text(), self.input_file_name.text() + ".xlsx") + parent_conn, child_conn = Pipe() script = Process(target=xgtf_to_excel_work, args=(work_dir, result_dir, child_conn)) script.start() + all_len = parent_conn.recv() data = parent_conn.recv() + while data != -1: - self.progressBar.setValue(int(data*100/all_len)) + self.progressBar.setValue(int(data * 100 / all_len)) data = parent_conn.recv() + self.progressBar.setValue(100) self.button_open_result_file.setVisible(True) self.button_open_result_file.clicked.connect(partial(self.open_result_file, result_dir)) - pass def open_result_file(self, file_path:str): - os.system("start " + file_path) + sub.run(["start", file_path], shell=True) pass if __name__ == '__main__': From 0ed636b473ee73c52e5865a0ebe8918b1ed79c69 Mon Sep 17 00:00:00 2001 From: Wintreist Date: Tue, 22 Aug 2023 12:57:15 +0300 Subject: [PATCH 4/8] =?UTF-8?q?GUI=20=D1=81=20=D0=BE=D1=82=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=BC=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D1=8B=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + .idea/workspace.xml | 162 ++++++++++++++++++ .../__pycache__/xgtf_to_excel.cpython-310.pyc | Bin 6656 -> 6656 bytes xgtf_to_excel/xgtf_to_excel_gui.py | 22 ++- 4 files changed, 180 insertions(+), 6 deletions(-) create mode 100644 .idea/workspace.xml diff --git a/.gitignore b/.gitignore index a05c910..2140a6d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ xgtf_to_excel/result.xlsx .idea/inspectionProfiles/profiles_settings.xml .idea/.gitignore result.xlsx + +gui-for-tester-tracker \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..c5e1418 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,162 @@ + + + + + + + + + + + + + + { + "lastFilter": { + "state": "OPEN", + "assignee": "Wintreist" + } +} + + + + + + { + "customColor": "", + "associatedIndex": -1 +} + + + + { + "keyToString": { + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "git-widget-placeholder": "xgtf__to__excel" + } +} + + + + + + + + + + + + + + + 1691487803526 + + + + + + + + + + + + + + + + + + + + + + + + file://$PROJECT_DIR$/xgtf_to_excel/xgtf_to_excel.py + 31 + + + + + \ No newline at end of file diff --git a/xgtf_to_excel/__pycache__/xgtf_to_excel.cpython-310.pyc b/xgtf_to_excel/__pycache__/xgtf_to_excel.cpython-310.pyc index 866b71d5bc8f72233445a22d0b6c98bacebe9b47..d4a555319632df17699e0a98b50f851476f91244 100644 GIT binary patch delta 20 acmZoLX)xi==jG*M00ODRCmXrHN&)~c#04+_ delta 20 acmZoLX)xi==jG*M00Jk``y08xN&)~b`vnI8 diff --git a/xgtf_to_excel/xgtf_to_excel_gui.py b/xgtf_to_excel/xgtf_to_excel_gui.py index 1df6349..649f9f0 100644 --- a/xgtf_to_excel/xgtf_to_excel_gui.py +++ b/xgtf_to_excel/xgtf_to_excel_gui.py @@ -5,7 +5,9 @@ from PyQt6 import uic, QtGui from PyQt6.QtWidgets import QMainWindow, QApplication, QPushButton, QLineEdit, QFileDialog, QMessageBox, QProgressBar from multiprocessing import Pipe, Process +from multiprocessing.connection import PipeConnection from xgtf_to_excel import xgtf_to_excel_work +from threading import Thread class MainWindow(QMainWindow): @@ -83,15 +85,23 @@ def start_program(self): script.start() all_len = parent_conn.recv() - data = parent_conn.recv() - while data != -1: + self.progressBar.valueChanged.connect(partial(self.updateProgressBar, all_len, parent_conn, result_dir, script)) + self.progressBar.setValue(0) + + + def updateProgressBar(self, all_len, parent_conn:PipeConnection, result_dir:str, script:Process): + data = parent_conn.recv() + if data != -1: self.progressBar.setValue(int(data * 100 / all_len)) - data = parent_conn.recv() + else: + self.progressBar.valueChanged.disconnect() + self.progressBar.setValue(100) + script.join() + self.button_open_result_file.setVisible(True) + self.button_open_result_file.clicked.connect(partial(self.open_result_file, result_dir)) + - self.progressBar.setValue(100) - self.button_open_result_file.setVisible(True) - self.button_open_result_file.clicked.connect(partial(self.open_result_file, result_dir)) def open_result_file(self, file_path:str): sub.run(["start", file_path], shell=True) From 90bfd2092604ac2ef2f04601bae020de96f67510 Mon Sep 17 00:00:00 2001 From: Wintreist Date: Tue, 22 Aug 2023 12:57:25 +0300 Subject: [PATCH 5/8] =?UTF-8?q?=D0=B8=20=D0=B5=D1=89=D1=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/xgtf_to_excel.cpython-310.pyc | Bin 6656 -> 6668 bytes xgtf_to_excel/xgtf_to_excel.py | 16 +++---- xgtf_to_excel/xgtf_to_excel_gui.py | 42 +++++++++--------- 3 files changed, 26 insertions(+), 32 deletions(-) diff --git a/xgtf_to_excel/__pycache__/xgtf_to_excel.cpython-310.pyc b/xgtf_to_excel/__pycache__/xgtf_to_excel.cpython-310.pyc index d4a555319632df17699e0a98b50f851476f91244..2ea47a95dc01fc1dc62a47471f2dff8e23976fd9 100644 GIT binary patch delta 2598 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 Date: Tue, 22 Aug 2023 13:49:12 +0300 Subject: [PATCH 6/8] =?UTF-8?q?=D0=B2=D0=BE=D1=82=20=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- .../__pycache__/xgtf_to_excel.cpython-310.pyc | Bin 6668 -> 0 bytes .../__pycache__/xgtf_to_excel.cpython-310.pyc | Bin 0 -> 6565 bytes .../__pycache__/xgtf_to_excel.cpython-311.pyc | Bin {xgtf_to_excel => xgtf_to_excel_dir}/icon.png | Bin .../requirements.txt | Bin {xgtf_to_excel => xgtf_to_excel_dir}/untitled.ui | 0 .../xgtf_to_excel.py | 4 +++- .../xgtf_to_excel_gui.py | 6 +++--- 9 files changed, 7 insertions(+), 5 deletions(-) delete mode 100644 xgtf_to_excel/__pycache__/xgtf_to_excel.cpython-310.pyc create mode 100644 xgtf_to_excel_dir/__pycache__/xgtf_to_excel.cpython-310.pyc rename {xgtf_to_excel => xgtf_to_excel_dir}/__pycache__/xgtf_to_excel.cpython-311.pyc (100%) rename {xgtf_to_excel => xgtf_to_excel_dir}/icon.png (100%) rename {xgtf_to_excel => xgtf_to_excel_dir}/requirements.txt (100%) rename {xgtf_to_excel => xgtf_to_excel_dir}/untitled.ui (100%) rename {xgtf_to_excel => xgtf_to_excel_dir}/xgtf_to_excel.py (98%) rename {xgtf_to_excel => xgtf_to_excel_dir}/xgtf_to_excel_gui.py (96%) diff --git a/.gitignore b/.gitignore index 2140a6d..73a6b27 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -xgtf_to_excel/result.xlsx +xgtf_to_excel_dir/result.xlsx .idea/misc.xml .idea/modules.xml .idea/vcs.xml diff --git a/xgtf_to_excel/__pycache__/xgtf_to_excel.cpython-310.pyc b/xgtf_to_excel/__pycache__/xgtf_to_excel.cpython-310.pyc deleted file mode 100644 index 2ea47a95dc01fc1dc62a47471f2dff8e23976fd9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6668 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 diff --git a/xgtf_to_excel_dir/__pycache__/xgtf_to_excel.cpython-310.pyc b/xgtf_to_excel_dir/__pycache__/xgtf_to_excel.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96e4d55f53122a66fe4d55447098ba74d3c5f0b7 GIT binary patch literal 6565 zcmai2S#TW3d7hqYXAdk60wgYx5HE2_0-zMR>`)X98l)U25rputtT9-RNO>c@Lrd+b4x4bW3=QXKH_?}9|OqG=H?*RyaWa8cG zo<9ER`TOthzq&azl+*Bg`)~h^Kb_IEf2GdepM%a4O4wqW#x>3Y%}t-o)m7i9o4Urd zy5-u8X7nIacU(ucS&((J7&C%gJ@4l01-GEa&0wfrbc^+2cep;{j;Jv!7_E=FW2$Wj z2kPVQglcDkgY`r1A+#NLl4sp1o)gnNk5UlBVn)nV^eL@k^C4b*V7jv$W0;w)n0$nf zV&oM*ChVHEJ$8VPW9%@W;0GUQ?h%pyuEr1X$p;#r+|sw0JEumb_%ueQ)yS(ts~znf z6I$&4C!f$+tdv+%yd>A#b>t1Tgqbvq}14+$}IteZIZ zn(~gvt1`(}s)6tteqAKC6j56?$~tXk`)A{sK`~Im2dLJu<6p9_{*l%LhWhMhz*5)v zsa9d!;N}A-)-P*Y?6P+2VAqUTP45}1He)R|`=FPn_x8JxZG&x$#|GEhOfE%M&yI~g z>sqnZ%S2Yq>9g%twvQ8pysc|m$zCa0u2H{p7gg&`*Q~e1I+{)N{kzqt*23m`R4GFf zp8aS~7RmvXa2nOR7HhY%UG|ao3+y0fztBE0{zl)x7a(%B@TrEQ(-+PqS+N<3Mu^k; zl*s~Klq0B~URyqY^9Bw$RQ1i(`{modtgp&uO_ZbX=KIw~Bt50v<2uSq%M;2Q5liY;>uaukh*2ROwCow&(b>3VTkymMjp5NeJqg}5^oL1;nWV7zw zt#Z*^xDYhUeh^+nV`qVq{_l8O{Uj|`$|VIUAR-aAE0yYIqBq0DZ28gc#IA+}g2b#f ztBu4c-+jX^e4o}`_FDjiNDMIGjxS$Y^;WOGx9Yuf_0qdnyyf?9tXy{syQ8buO18}7 zQ%X!p?wR01H>cS2=xaM|LY!-p$4qt*|016HSB{Zm zlg!lR5n9KLs&%ms1tx|G1OSK~Uy^;q8>2dzPP z;YO^h+5mP4mF7xyq^N06E@0uO>^x~OU{EsU90n5WcC#(RBvY?8+L1sb6y;`vhw1JK zRO#-EILUH5@FU?7|MYH1xGS*q@33(uU&8?QC&m8#k(LgjsQtZz23Py)X??B7xE?8f zRc)%;Qnejn2R!phzE66a>0-AvlRHydmu*bNuyLjAN@A`w8{(KeB8!zDV~w~sE9%{zK)vEy)2@!LVPnAqW6KWK}@Qje0AWN_57 z*^H7*rP|=Ifr<6~@2y_Bnq<}E@}=vS5<6YFWXMyr>!Iz{ymYDTv+q7H$QgpsK4P!Z zl%6uhv{Fbu(`0Wzt|pV;KxZFT$a;`Gl`Q`p4Z=#qwsbi}NP*|bbFxR;wRA?u%yD2s zy9)yY3KJBwM1i)2_R)RR2B^P@85=W;G!wx>Zh?&*D$HqZO}@R;FJ)FFvDBGf^UHVE zWwYJj^W|pHl;`J;RVr_mzp?g~EP)`=I@Y=K_@`=bCAn%?ZG@5ED8oY#fe}U$z9?w= zkt7)as2LFm@>S8D-y(v~UR}l&FN}GOoG$4NVxr{p&9#J$wxQY?)i%+#Tt{RvZmV`qwKEqq zkrxH-JY?<=e0>4MAU{8)fierqoEV1B&+`J}i4i^oG#3-+2QbE$;R+LnEZ++7s)U;q znrq5{FGIXhGPd1&M;Tl-ri7XdDZ6#KEq!w1Nj|m6ir`b04DW!h0@L4=_mhmmoCqc9 z<_jRBBTyhak4CK3sIUlTr)F%yDAfQAs3W^$$O*J8>dnAua-AD+mRc>-XX~~yKWYz( z!>84Y|xhUd?(57 z{!eFgM~n+Qlq;pt#PL)(;dx2U^Xg6BMttEV1<%`P`vI8-&y(N6V#%-vkJe~LN{Asw z6{`f%l))ux{UKF~X@U)~3xh#SOS0pMN&ZfLm-@7}3M5 zsGAuz{{lP>&@RzSR6P$*z|0b+umP_O*8wkp7Vt8;1$a5!7B+er?x2_DS)58P$zKYB z9YIOrCdqmf3=sZaM1&54XD(_Doe0K;+*71Z`~jgug;?~>hx$!3W**#;M^6jIjxsgy z!Hr$Yze0H9Wx>^+v6%I8eQli`g83>rD{aay20wrNlfjpRe;jrs1kIqRkY`TooZ2I^ zXW)8Sn4=(HVy@|LR>K$ArlVAB)A=j5t(5J(jItC@s~~w9TR+@kYiz&jl2{0mYJJ*- zTHmJi$=~k(fsKQ zlFv_aF!mAjqFR1FxKNt%1JEen=de?VmZn)}{AJRXWRCXb0<>e2=rS!png%E$u83Km zAr~Sbu@&$@Ov7onTB5(yG2Wp6v+p7#`f}&F0fL{$v?up{2o<*OcjyK zcd1h1Asv@wp;9wItM2)dG6)J{E100kkf5H^4(dg{Xqkqj@lIYMEDoZD%^=)N97JFN zdD$}UcIQVBqUcub{y!j#NZUf@6C=BZpDso)**$pwK9seA=qhb@&DgxGeavpz$Y_X? z$uqGIUvKu1;q;M}j%$$}n_FxK-hT^njFIW*- zQnmdFxam5v(;M3!&wPSB4DsOAZZ@_}t#*Jr-_&%?I}m4|(PX1>tdOI3RmPW7loQcG z8fz5ws&}Yc3ka#V()CX z0L~8cgLm}szv2Qt<$p&rKVgvd7;*A3yPr>aiH^`oZ0R?3TCrRB0B#w)&^yM*Odg_j z;=+uE*}2_w!I{2VJBt1>7+~CL{F3p>hkADiqsL>$ai@V^F&?U&=$(vS1J}pmBJLq( z>E7a@i4z`ztWS1_qf_xvJPhfUqSJlWI}_p5d#Cz@r(sB1=guLmJA!r2_U7YZ$YeAw z))x2--dK!B@gM0M4A|Vb7#Dlz`h*=FTub0oA(1p%Y4wqnCmg_+6ahT>8b5g&t&T-^ z35#wnL|#)CDucAsfa!?}RA-+><~td|YBQ`-z=WhAG1u0boBIql>2(H08Pv0AD1$l% z&xf!ZMiuG<<$|!gI@At|Hwn*pXxq@j&>Y1p@&i=3U@_``D-Cw7uoYA(2~*Cepn8IP z^mRlJq7o&RtghdFKJu01k$!}tJknXMbCTTFZvIa9Col6yZZ?etTYlpyo0DgVC)$gg zN0pc)rOqoa2xjHRyDF)^M(L8Vu(EWGM}sevcmGwJ!uP@75#8XQ@&9ZNWWOGK4vH`5 zPCfomQEp-4^HTfx|3^CbV({7E^T$7a{FkLR`JF-k@sIKH=Xmwe;L#kW!OXnk0TZ7M zevAGWFR(M0var3@;8B}$U2NnxgU_&q53xA16XZGVdIR?eWS{TJYJ{6L=GvmMUTp~1 zzII!P==FCJW5r)789*fU(>pB-X{Fe7?S}73(JH;J%)KNRAn5`j$xr}^%NPX~S*9T) z5Dhx122Xvle&u>%wbXUq6un1rbCOf{dsiqalH^rDA?eO%fhf*VwMdnUXkVw63Wl=O zdV?zR`O0%AhR->!4R^BVbVL%&-O5RZK!c!7AuCeCJ^xnrLv!GIScbrmtkNV!Ok#L>6UTP*JMSSkm%ZNNu zlx!tMbh~-k%(QGWMe8u3 Date: Tue, 22 Aug 2023 13:55:26 +0300 Subject: [PATCH 7/8] =?UTF-8?q?=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B0=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xgtf_to_excel_dir/xgtf_to_excel_gui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xgtf_to_excel_dir/xgtf_to_excel_gui.py b/xgtf_to_excel_dir/xgtf_to_excel_gui.py index 44310e8..563acb0 100644 --- a/xgtf_to_excel_dir/xgtf_to_excel_gui.py +++ b/xgtf_to_excel_dir/xgtf_to_excel_gui.py @@ -97,7 +97,7 @@ def endBackgroundProcessFunction(self, result_dir:str): def threadFunctionForBackgroundProcess(self, work_dir:str, result_dir:str, updateSignal:pyqtSignal, endSignal:pyqtSignal): - callback = lambda x: updateSignal.emit(x) + callback = updateSignal.emit xgtf_to_excel_work(work_dir, result_dir, callback) endSignal.emit() From 5b75cefbdb503fa9bcce28197bf569fac8c0014e Mon Sep 17 00:00:00 2001 From: Wintreist Date: Tue, 22 Aug 2023 16:13:34 +0300 Subject: [PATCH 8/8] =?UTF-8?q?=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D0=B0,=20?= =?UTF-8?q?=D0=BF=D1=83=D1=81=D1=82=D0=BE=D1=82=D1=8B,=20=D0=BE=D1=82?= =?UTF-8?q?=D1=81=D1=82=D1=83=D0=BF=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/xgtf_to_excel.cpython-310.pyc | Bin 6565 -> 6565 bytes xgtf_to_excel_dir/untitled.ui | 241 ++++++++++-------- xgtf_to_excel_dir/xgtf_to_excel_gui.py | 24 +- 3 files changed, 137 insertions(+), 128 deletions(-) diff --git a/xgtf_to_excel_dir/__pycache__/xgtf_to_excel.cpython-310.pyc b/xgtf_to_excel_dir/__pycache__/xgtf_to_excel.cpython-310.pyc index 96e4d55f53122a66fe4d55447098ba74d3c5f0b7..0266aa2c8f6eb8e98f855cab0b45cda0e4240bb1 100644 GIT binary patch delta 19 ZcmZ2#ywsR0pO=@50SHvqZ{(US2>>qK1dsp# delta 19 ZcmZ2#ywsR0pO=@50SIg-ZRDCQ2>>qP1dIRx diff --git a/xgtf_to_excel_dir/untitled.ui b/xgtf_to_excel_dir/untitled.ui index b87b2f5..0f2ec3b 100644 --- a/xgtf_to_excel_dir/untitled.ui +++ b/xgtf_to_excel_dir/untitled.ui @@ -6,14 +6,14 @@ 0 0 - 750 - 250 + 620 + 252 - 750 - 250 + 0 + 0 @@ -21,110 +21,135 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + - - - - - - - Выход из программы - - - - - - - Очистить поля - - - - - - - ... - - - - - - - Запустить - - - - - - - true - - - - - - - ... - - - - - - - true - - - - - - - Выберите директорию для файла с результатом - - - - - - - - - - .xlsx - - - - - - - Введите название файла с результатом - - - - - - - Выберите рабочую директорию - - - - - - - - - Открыть файл с результатом - - - - - - - 0 - - - false - - - - + + + + + + + + + + + + + Выход из программы + + + + + + + Очистить поля + + + + + + + ... + + + + + + + Запустить + + + + + + + true + + + + + + + ... + + + + + + + true + + + + + + + Выберите директорию для файла с результатом + + + + + + + + + + .xlsx + + + + + + + Введите название файла с результатом + + + + + + + Выберите рабочую директорию + + + + + + + + + Открыть файл с результатом + + + + + + + false + + + 0 + + + true + + + + + + + @@ -133,7 +158,7 @@ 0 0 - 750 + 620 21 diff --git a/xgtf_to_excel_dir/xgtf_to_excel_gui.py b/xgtf_to_excel_dir/xgtf_to_excel_gui.py index 563acb0..6547db9 100644 --- a/xgtf_to_excel_dir/xgtf_to_excel_gui.py +++ b/xgtf_to_excel_dir/xgtf_to_excel_gui.py @@ -8,17 +8,12 @@ from threading import Thread from xgtf_to_excel import xgtf_to_excel_work - class MainWindow(QMainWindow): - updateProgressBarSignal = pyqtSignal(int) endBackgroundProcess = pyqtSignal() - def __init__(self): super(MainWindow, self).__init__() uic.loadUi('xgtf_to_excel_dir/untitled.ui', self) - - # Определение виджетов self.input_work_dir = self.findChild(QLineEdit, "input_work_dir") self.input_result_dir = self.findChild(QLineEdit, "input_result_dir") @@ -42,67 +37,56 @@ def __init__(self): self.button_open_result_file.setVisible(False) # ~~~~~~~~ # Сигналы - self.button_select_work_dir.clicked.connect(partial(self.openFileExplorer, self.input_work_dir)) self.button_select_result_dir.clicked.connect(partial(self.openFileExplorer, self.input_result_dir)) self.button_exit.clicked.connect(self.close) self.button_clear_input.clicked.connect(self.clear_all_inputs) self.button_start.clicked.connect(self.start_program) # ~~~~~~~~ - self.show() pass - def openFileExplorer(self, input_directory:QLineEdit): directory = QFileDialog.getExistingDirectory(self, "Выберите директорию") if directory != '': input_directory.setText(directory) pass - def set_default_value(self): self.input_file_name.setText("result") self.input_result_dir.setText(os.getcwd()) self.progressBar.setValue(0) self.button_open_result_file.setVisible(False) pass - def clear_all_inputs(self): for input in self.findChildren(QLineEdit): input.setText('') self.set_default_value() pass - def start_program(self): if not self.input_work_dir.text(): QMessageBox.critical(self, "Ошибка запуска", "Вы не ввели рабочую директорию!") return False - if not self.input_file_name.text(): QMessageBox.critical(self, "Ошибка запуска", "Вы не ввели название файла с результатом!") return False - self.button_start.setEnabled(False) + self.button_open_result_file.setVisible(False) work_dir = os.path.join(self.input_work_dir.text()) result_dir = os.path.join(self.input_result_dir.text(), self.input_file_name.text() + ".xlsx") - self.updateProgressBarSignal.connect(self.progressBar.setValue) self.endBackgroundProcess.connect(partial(self.endBackgroundProcessFunction, result_dir)) self.backgroundThread = Thread(target=self.threadFunctionForBackgroundProcess, args=(work_dir, result_dir, self.updateProgressBarSignal, self.endBackgroundProcess)) self.backgroundThread.start() - + pass def endBackgroundProcessFunction(self, result_dir:str): self.button_start.setEnabled(True) self.button_open_result_file.setVisible(True) self.button_open_result_file.clicked.connect(partial(self.open_result_file, result_dir)) - - + pass def threadFunctionForBackgroundProcess(self, work_dir:str, result_dir:str, updateSignal:pyqtSignal, endSignal:pyqtSignal): callback = updateSignal.emit xgtf_to_excel_work(work_dir, result_dir, callback) endSignal.emit() - - - + pass def open_result_file(self, file_path:str): sub.run(["start", file_path], shell=True) pass