Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

main

.py
Скачиваний:
0
Добавлен:
07.04.2025
Размер:
9.94 Кб
Скачать
import json
import tkinter as tk
from tkinter import ttk, messagebox


# Функции для работы с данными
def save_data():
    with open("risk_data.json", "w") as f:
        json.dump(data, f, indent=4)


def load_data():
    try:
        with open("risk_data.json", "r") as f:
            return json.load(f)
    except (FileNotFoundError, json.JSONDecodeError):
        return {"states": {}, "initiating_events": {}, "scenarios": {}}


def calculate_risk(probability, loss):
    return probability * loss


def calculate_system_risk():
    total_risk = 0
    results_text.delete(1.0, tk.END)  # Очищаем текстовое поле перед расчетом

    results_text.insert(tk.END, "Расчет рисков для сценариев:\n\n")
    for scenario, details in data["scenarios"].items():
        event = details["event"]
        state = details["state"]
        event_probability = data["initiating_events"].get(event, 0)
        state_probability = data["states"].get(state, {}).get("probability", 0)
        loss = data["states"].get(state, {}).get("loss", 0)

        # Вероятность сценария = вероятность события * вероятность состояния
        scenario_probability = event_probability * state_probability
        scenario_risk = calculate_risk(scenario_probability, loss)
        total_risk += scenario_risk

        # Вывод информации о сценарии
        results_text.insert(tk.END, f"Сценарий: {scenario}\n")
        results_text.insert(tk.END, f"  Инициирующее событие: {event} (вероятность: {event_probability:.4f})\n")
        results_text.insert(tk.END, f"  Опасное состояние: {state} (вероятность: {state_probability:.4f}, потери: {loss:.4f})\n")
        results_text.insert(tk.END, f"  Вероятность сценария: {scenario_probability:.4f}\n")
        results_text.insert(tk.END, f"  Риск сценария: {scenario_risk:.4f}\n\n")

    results_text.insert(tk.END, f"Общий риск системы: {total_risk:.4f}\n")
    result_text.set(f"Общий риск ИС: {total_risk:.4f}")


# Добавление опасного состояния
def add_state():
    state = state_entry.get().strip()
    if state and state not in data["states"]:
        data["states"][state] = {"probability": 0.0, "loss": 0.0}
        state_listbox.insert(tk.END, state)
        state_combobox["values"] = list(data["states"].keys())
        state_entry.delete(0, tk.END)
        save_data()
    else:
        messagebox.showerror("Ошибка", "Состояние уже существует или поле пустое")



# Добавление инициирующего события
def add_event():
    event = event_entry.get().strip()
    if event and event not in data["initiating_events"]:
        data["initiating_events"][event] = 0.0
        event_listbox.insert(tk.END, event)
        event_combobox["values"] = list(data["initiating_events"].keys())
        event_entry.delete(0, tk.END)
        save_data()
    else:
        messagebox.showerror("Ошибка", "Событие уже существует или поле пустое")


# Добавление сценария
def add_scenario():
    scenario = scenario_entry.get().strip()
    event = event_combobox.get()
    state = state_combobox.get()

    if not scenario or not event or not state:
        messagebox.showerror("Ошибка", "Выберите инициирующее событие и опасное состояние")
        return

    if scenario not in data["scenarios"]:
        data["scenarios"][scenario] = {"event": event, "state": state}
        scenario_listbox.insert(tk.END, scenario)
        scenario_entry.delete(0, tk.END)
        save_data()
    else:
        messagebox.showerror("Ошибка", "Сценарий уже существует")


# Ввод вероятностей и потерь
def enter_probabilities():
    selected_state = state_listbox.get(tk.ACTIVE)
    if selected_state:
        try:
            probability = float(probability_entry.get())
            data["states"][selected_state]["probability"] = probability
            messagebox.showinfo("Успех", f"Вероятность для '{selected_state}' обновлена.")
            save_data()
        except ValueError:
            messagebox.showerror("Ошибка", "Введите корректное число для вероятности.")
    else:
        messagebox.showerror("Ошибка", "Выберите состояние для ввода вероятности.")


def enter_losses():
    selected_state = state_listbox.get(tk.ACTIVE)
    if selected_state:
        try:
            loss = float(loss_entry.get())
            data["states"][selected_state]["loss"] = loss
            messagebox.showinfo("Успех", f"Потери для '{selected_state}' обновлены.")
            save_data()
        except ValueError:
            messagebox.showerror("Ошибка", "Введите корректное число для потерь.")
    else:
        messagebox.showerror("Ошибка", "Выберите состояние для ввода потерь.")


# Ввод вероятности для инициирующих событий
def enter_event_probability():
    selected_event = event_listbox.get(tk.ACTIVE)
    if selected_event:
        try:
            probability = float(event_probability_entry.get())
            data["initiating_events"][selected_event] = probability
            messagebox.showinfo("Успех", f"Вероятность для '{selected_event}' обновлена.")
            save_data()
        except ValueError:
            messagebox.showerror("Ошибка", "Введите корректное число для вероятности.")
    else:
        messagebox.showerror("Ошибка", "Выберите событие для ввода вероятности.")


# Сохранение результатов в файл
def save_results_to_file():
    with open("results.txt", "w", encoding="utf-8") as f:
        f.write(results_text.get(1.0, tk.END))
    messagebox.showinfo("Успех", "Результаты сохранены в файл results.txt")


# Интерфейс
root = tk.Tk()
root.title("Оценка рисков ИС")

notebook = ttk.Notebook(root)
notebook.pack(fill="both", expand=True)

# Вкладка "Опасные состояния"
states_frame = ttk.Frame(notebook)
notebook.add(states_frame, text="Опасные состояния")

state_entry = tk.Entry(states_frame, width=30)
state_entry.pack(side=tk.LEFT, padx=5)
tk.Button(states_frame, text="Добавить", command=add_state).pack(side=tk.RIGHT, padx=5)

state_listbox = tk.Listbox(states_frame, height=5)
state_listbox.pack(fill="both", expand=True, pady=5)

# Ввод вероятностей и потерь
probability_entry = tk.Entry(states_frame, width=15)
probability_entry.pack(side=tk.LEFT, padx=5)
tk.Button(states_frame, text="Ввести вероятность", command=enter_probabilities).pack(side=tk.LEFT, padx=5)

loss_entry = tk.Entry(states_frame, width=15)
loss_entry.pack(side=tk.LEFT, padx=5)
tk.Button(states_frame, text="Ввести потери", command=enter_losses).pack(side=tk.LEFT, padx=5)

# Вкладка "Инициирующие события"
events_frame = ttk.Frame(notebook)
notebook.add(events_frame, text="Инициирующие события")

event_entry = tk.Entry(events_frame, width=30)
event_entry.pack(side=tk.LEFT, padx=5)
tk.Button(events_frame, text="Добавить", command=add_event).pack(side=tk.RIGHT, padx=5)

event_listbox = tk.Listbox(events_frame, height=5)
event_listbox.pack(fill="both", expand=True, pady=5)

# Ввод вероятности для инициирующих событий
event_probability_entry = tk.Entry(events_frame, width=15)
event_probability_entry.pack(side=tk.LEFT, padx=5)
tk.Button(events_frame, text="Ввести вероятность", command=enter_event_probability).pack(side=tk.LEFT, padx=5)

# Вкладка "Сценарии"
scenarios_frame = ttk.Frame(notebook)
notebook.add(scenarios_frame, text="Сценарии")

scenario_entry = tk.Entry(scenarios_frame, width=30)
scenario_entry.pack(side=tk.LEFT, padx=5)

event_combobox = ttk.Combobox(scenarios_frame, width=30, state="readonly")
event_combobox.pack(side=tk.LEFT, padx=5)

state_combobox = ttk.Combobox(scenarios_frame, width=30, state="readonly")
state_combobox.pack(side=tk.LEFT, padx=5)

tk.Button(scenarios_frame, text="Добавить сценарий", command=add_scenario).pack(side=tk.RIGHT, padx=5)

scenario_listbox = tk.Listbox(scenarios_frame, height=5)
scenario_listbox.pack(fill="both", expand=True, pady=5)

# Вкладка "Результаты"
results_frame = ttk.Frame(notebook)
notebook.add(results_frame, text="Результаты")

result_text = tk.StringVar()
tk.Label(results_frame, textvariable=result_text).pack()

results_text = tk.Text(results_frame, height=15, width=80)
results_text.pack(fill="both", expand=True, pady=5)

tk.Button(results_frame, text="Рассчитать общий риск", command=calculate_system_risk).pack()
tk.Button(results_frame, text="Сохранить результаты", command=save_results_to_file).pack()

# Загрузка данных
data = load_data()

# Обновление Combobox
state_combobox["values"] = list(data["states"].keys())
event_combobox["values"] = list(data["initiating_events"].keys())

root.mainloop()
Соседние файлы в предмете Теория принятия решений