/
O.S.Prog
/
DiScan
Обзор
Документация
Войти
/
O.S.Prog
/
DiScan
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.py
144 строки
5 KB
O.S.Prog
Initial commit: DiScan v1.1.0
18 июл 2026, 15:51
18 июл 2026, 15:51
238a6ec
Код
Авторство
О чём код?
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ DICOM Explorer - Поиск пациентов в DICOM-файлах """ import sys import os import warnings import argparse import tkinter as tk # Подавляем все предупреждения pydicom warnings.filterwarnings("ignore", category=UserWarning, module="pydicom") warnings.filterwarnings("ignore", category=UserWarning, module="pydicom.charset") warnings.filterwarnings("ignore", category=UserWarning, module="pydicom.valuerep") # Добавляем текущую папку в путь sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) def check_dependencies(): """Проверяет установку необходимых библиотек""" try: import pydicom print("✅ pydicom установлен") except ImportError: print("❌ Библиотека pydicom не установлена.") print(" Установите: pip install pydicom") return False try: import openpyxl print("✅ openpyxl установлен") except ImportError: print("⚠️ Библиотека openpyxl не установлена.") print(" Установите: pip install openpyxl (для экспорта в Excel)") return True def console_mode(path: str, export_format: str = None): """Консольный режим работы""" from core.scanner import DICOMScanner from pathlib import Path print(f"\n🔍 Сканируем: {path}") scanner = DICOMScanner(path) result = scanner.scan() if not result.patients: print("\n❌ Пациенты не найдены") return print("\n" + "="*110) print(f"{'№':<4} | {'ФИО пациента':<35} | {'ID':<20} | {'Дата':<12} | {'Сн.':<4} | {'Файлы':<5}") print("="*110) for idx, patient in enumerate(result.patients, 1): name = patient.patient_name[:33] + '...' if len(patient.patient_name) > 33 else patient.patient_name print(f"{idx:<4} | {name:<35} | {patient.patient_id:<20} | {patient.study_date:<12} | {patient.image_count:<4} | {patient.total_files:<5}") print("="*110) print(f"Всего пациентов: {len(result.patients)}") if export_format: from export.excel_exporter import ExcelExporter from export.csv_exporter import CSVExporter from export.txt_exporter import TxtExporter exporters = { 'excel': ExcelExporter(), 'csv': CSVExporter(), 'txt': TxtExporter() } exporter = exporters.get(export_format) if exporter: output_file = f"patients{exporter.extension}" exporter.export(result.patients, Path(output_file)) print(f"\n💾 Результаты сохранены в: {output_file}") return result def gui_mode(): """Запуск графического интерфейса""" from gui.main_window import MainWindow from gui.splash_screen import show_splash # Показываем заставку (она закроется через 5 секунд) show_splash() # После закрытия заставки создаём главное окно root = tk.Tk() root.title("DiSc — DICOM Scanner") root.geometry("1200x700") root.minsize(900, 500) # Устанавливаем иконку (если есть) try: root.iconbitmap('icon.ico') except: pass app = MainWindow(root) root.mainloop() def main(): parser = argparse.ArgumentParser( description='DICOM Explorer - Поиск пациентов в DICOM-файлах', epilog='Примеры:\n' ' python main.py -g # Запуск GUI\n' ' python main.py -c -p "C:/DICOM" # Консольный режим\n' ' python main.py -c -p "C:/DICOM" -e excel # Консоль + экспорт' ) parser.add_argument('-g', '--gui', action='store_true', help='Запустить графический интерфейс') parser.add_argument('-c', '--console', action='store_true', help='Запустить в консольном режиме') parser.add_argument('-p', '--path', type=str, help='Путь к папке для сканирования') parser.add_argument('-e', '--export', type=str, choices=['excel', 'csv', 'txt'], help='Формат экспорта (только консольный режим)') args = parser.parse_args() # Проверяем зависимости if not check_dependencies(): sys.exit(1) # Определяем режим работы if args.console or args.path: if not args.path: print("❌ Укажите путь к папке: python main.py -c -p /путь/к/папке") sys.exit(1) console_mode(args.path, args.export) else: # По умолчанию - GUI gui_mode() if __name__ == "__main__": main()