
Добавил:
eeeikh
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:main
.pyimport 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()
Соседние файлы в предмете Теория принятия решений