Рефакторинг проекта: разделение на модули, улучшенный интерфейс, обработка Excel

This commit is contained in:
2025-08-04 00:31:05 +05:00
parent 059f174dd5
commit a882a81180
22 changed files with 1936 additions and 530 deletions

158
build_32bit_final.py Normal file
View File

@@ -0,0 +1,158 @@
"""
Скрипт для создания 32-битной версии программы KadastrParser
Использует Python 3.8 (32-bit)
"""
import subprocess
import sys
import os
from pathlib import Path
def build_32bit_version():
"""Создает 32-битную версию программы"""
print("🔧 Создание 32-битной версии KadastrParser")
print("=" * 50)
# Проверяем, что мы в правильной директории
if not os.path.exists("main.py"):
print("❌ Файл main.py не найден!")
print(" Убедитесь, что скрипт запускается из директории с исходным кодом")
return False
# Параметры для PyInstaller (32-bit)
pyinstaller_args = [
"py", "-3.8-32", "-m", "PyInstaller",
"main.py",
"--onefile",
"--windowed",
"--name=KadastrParser_32bit",
"--icon=NONE",
"--add-data=services;services",
"--add-data=models;models",
"--hidden-import=tkinter",
"--hidden-import=pandas",
"--hidden-import=openpyxl",
"--hidden-import=lxml",
"--hidden-import=pathlib2",
"--clean",
"--noconfirm",
"--distpath=dist_32bit", # Отдельная папка для 32-битной версии
"--workpath=build_32bit",
"--specpath=."
]
print("📋 Параметры сборки:")
for arg in pyinstaller_args[4:]: # Пропускаем "py -3.8-32 -m PyInstaller"
print(f" {arg}")
print()
print("🚀 Запуск PyInstaller...")
try:
# Запускаем PyInstaller
result = subprocess.run(pyinstaller_args, check=True, capture_output=True, text=True)
print("✅ 32-битная сборка завершена успешно!")
# Проверяем результат
exe_path = Path("dist_32bit") / "KadastrParser_32bit.exe"
if exe_path.exists():
size_mb = exe_path.stat().st_size / (1024 * 1024)
print(f"📁 Исполняемый файл: {exe_path}")
print(f"📏 Размер файла: {size_mb:.1f} MB")
# Проверяем архитектуру созданного файла
check_exe_architecture(exe_path)
else:
print("❌ Исполняемый файл не найден!")
return False
return True
except subprocess.CalledProcessError as e:
print(f"❌ Ошибка при сборке:")
print(f" Код выхода: {e.returncode}")
if e.stdout:
print(f" Вывод: {e.stdout}")
if e.stderr:
print(f" Ошибки: {e.stderr}")
return False
except Exception as e:
print(f"❌ Неожиданная ошибка: {e}")
return False
def check_exe_architecture(exe_path):
"""Проверяет архитектуру исполняемого файла"""
try:
# Используем file command или dumpbin если доступны
result = subprocess.run(
["file", str(exe_path)],
capture_output=True,
text=True,
errors='ignore'
)
if result.returncode == 0:
output = result.stdout.lower()
if "pe32" in output and "pe32+" not in output:
print("✅ Архитектура: 32-bit (PE32)")
elif "pe32+" in output:
print("⚠️ Архитектура: 64-bit (PE32+)")
else:
print(f" Архитектура: {output.strip()}")
else:
print(" Не удалось определить архитектуру (file command недоступен)")
except FileNotFoundError:
print(" Не удалось определить архитектуру (file command не найден)")
except Exception as e:
print(f" Ошибка при проверке архитектуры: {e}")
def create_readme():
"""Создает README для 32-битной версии"""
readme_content = """# KadastrParser 32-bit версия
## Системные требования
- Windows 7/8/10/11 (32-bit или 64-bit)
- Минимум 512 MB оперативной памяти
- 100 MB свободного места на диске
## Установка
1. Скачайте KadastrParser_32bit.exe
2. Поместите файл в любую папку
3. Запустите двойным кликом
## Использование
1. Запустите программу
2. Выберите папку с XML файлами
3. (Опционально) Выберите Excel файл со списком кадастровых номеров
4. Нажмите "Начать обработку"
## Результаты
Программа создает папку "results" рядом с exe файлом:
- all_xml_files/ - все найденные XML файлы
- matching_cadastral_files/ - файлы из Excel списка
- updated_cadastral_list.xlsx - обновленный Excel файл
- processing_report.txt - подробный отчет
## Поддержка
Программа поддерживает кадастровые номера в формате: XX:XX:XXXXXXX:XXX
"""
readme_path = Path("dist_32bit") / "README.txt"
readme_path.parent.mkdir(exist_ok=True)
with open(readme_path, 'w', encoding='utf-8') as f:
f.write(readme_content)
print(f"📝 Создан файл README: {readme_path}")
if __name__ == "__main__":
success = build_32bit_version()
if success:
create_readme()
print("\n🎉 32-битная версия готова к использованию!")
print("📦 Файлы находятся в папке 'dist_32bit'")
else:
print("\n💥 Сборка не удалась!")
sys.exit(1)