import tkinter as tk from tkinter import filedialog, messagebox import csv import os # --- Основная функция конвертации --- def convert_csv_to_html(csv_file_path, html_file_path): """ Читает semicolon-separated CSV файл и создает красивую HTML-страницу. Возвращает (True, сообщение) в случае успеха или (False, сообщение) в случае ошибки. """ try: with open(csv_file_path, 'r', encoding='utf-8') as f: reader = csv.DictReader(f, delimiter=';') headers = reader.fieldnames if not headers: return False, "CSV-файл пуст или не имеет заголовков." rows = list(reader) except FileNotFoundError: return False, f"Файл не найден: {csv_file_path}" except Exception as e: return False, f"Ошибка при чтении CSV: {e}" # CSS для красивого оформления css_style = """ """ # Начало HTML-документа html_content = f""" {os.path.basename(html_file_path)} {css_style}

Анализ дизассемблерного листинга: {os.path.basename(csv_file_path)}

""" for header in headers: html_content += f"\n" html_content += "\n" # Добавляем строки таблицы for row in rows: address = row.get('адрес', '').strip() target_address = row.get('целевой_адрес', '').strip() link_html = target_address if target_address: link_html = f'{target_address}' # Присваиваем id каждой строке на основе ее адреса row_id = address if address else '' html_content += f'\n' html_content += f'\n' html_content += f'\n' html_content += f'\n' html_content += f'\n' html_content += "\n" html_content += "
{header}
{address}{row.get("байт", "")}{link_html}{row.get("исходная_команда", "")}
" # Запись HTML в файл try: with open(html_file_path, 'w', encoding='utf-8') as f: f.write(html_content) return True, f"Успешно! Файл сохранен как:\n{html_file_path}" except Exception as e: return False, f"Ошибка при записи HTML файла: {e}" # --- Функция-обработчик нажатия на кнопку --- def open_file_and_convert(): # Открываем диалог выбора файла file_path = filedialog.askopenfilename( title="Выберите CSV-файл для конвертации", filetypes=(("CSV файлы", "*.csv"), ("Все файлы", "*.*")) ) # Если пользователь не выбрал файл, выходим if not file_path: status_label.config(text="Операция отменена.") return # Формируем имя для выходного HTML-файла base_name = os.path.splitext(file_path)[0] output_path = f"{base_name}.html" # Обновляем статус status_label.config(text="Обработка файла...") root.update_idletasks() # Принудительно обновляем интерфейс # Вызываем функцию конвертации success, message = convert_csv_to_html(file_path, output_path) # Показываем результат if success: status_label.config(text="Готово!") messagebox.showinfo("Успех", message) else: status_label.config(text="Произошла ошибка.") messagebox.showerror("Ошибка", message) # --- Создание графического интерфейса --- root = tk.Tk() root.title("CSV в HTML Конвертер") root.geometry("450x200") # Размер окна root.resizable(False, False) # Запрещаем изменять размер # Создаем фрейм для лучшего расположения элементов main_frame = tk.Frame(root, padx=20, pady=20) main_frame.pack(expand=True, fill=tk.BOTH) # Кнопка "Открыть" open_button = tk.Button( main_frame, text="Открыть CSV-файл", command=open_file_and_convert, width=20, height=2, font=("Helvetica", 12) ) open_button.pack(pady=10) # Метка для отображения статуса status_label = tk.Label( main_frame, text="Нажмите кнопку, чтобы выбрать файл", wraplength=400, # Перенос длинных строк justify=tk.CENTER ) status_label.pack(pady=10) # Запускаем главный цикл приложения root.mainloop()