"""
Frontend Model Details Page File for AGE-ABM Visual Interface
@Author Meghan Ireland
@Co-Authors Max Hall and Matthew Fleischman
"""
import tkinter as tk
import customtkinter
[docs]
class Details:
"""Defines widgets and functionality of model details page.
"""
def __init__(self, ec_app_ui):
"""Creates all variables and widgets for the model details page.
"""
self.ec_app_ui = ec_app_ui
self.agents = []
self.parameters = []
self.current_initial_parameter = ""
self.is_agent = True
### Titles ###
self.label_details_title = tk.Label(self.ec_app_ui.title_frame, text="Model details"
, font=self.ec_app_ui.font1,bg=self.ec_app_ui.title_colour
, fg=self.ec_app_ui.label_text_colour)
### Labels ###
self.label_details_set_seed = tk.Label(self.ec_app_ui.page_frame, text="Set Seed:"
, font=self.ec_app_ui.font2,bg=self.ec_app_ui.frame_colour
,fg=self.ec_app_ui.label_text_colour)
self.label_details_set_iterations = tk.Label(self.ec_app_ui.page_frame
, text="Set number of iterations:", font=self.ec_app_ui.font2
, bg=self.ec_app_ui.frame_colour,fg=self.ec_app_ui.label_text_colour)
self.label_details_agent_parameters = tk.Label(self.ec_app_ui.page_frame
, text="For Agent: , enter the number of :", font=self.ec_app_ui.font2
, bg=self.ec_app_ui.frame_colour,fg=self.ec_app_ui.label_text_colour)
self.label_details_intial_value = tk.Label(self.ec_app_ui.page_frame, text="Initial Value: "
, font=self.ec_app_ui.font2,bg=self.ec_app_ui.frame_colour
, fg=self.ec_app_ui.label_text_colour)
### Entry ###
self.entry_details_set_seed = customtkinter.CTkEntry(self.ec_app_ui.page_frame
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, width = self.ec_app_ui.entry_width, fg_color = self.ec_app_ui.entry_colour
, text_color = self.ec_app_ui.entry_text_colour)
self.entry_details_set_iterations = customtkinter.CTkEntry(self.ec_app_ui.page_frame
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, width = self.ec_app_ui.entry_width,fg_color = self.ec_app_ui.entry_colour
, text_color = self.ec_app_ui.entry_text_colour)
self.entry_details_initial_value = customtkinter.CTkEntry(self.ec_app_ui.page_frame
, font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height
, width = self.ec_app_ui.entry_width, fg_color = self.ec_app_ui.entry_colour
, text_color = self.ec_app_ui.entry_text_colour)
### Buttons ###
self.button_details_save = customtkinter.CTkButton(self.ec_app_ui.page_frame
, text="✔️ Save Details", command=self.btn_details_save
, fg_color=self.ec_app_ui.comp_btn_colour, font = self.ec_app_ui.font2
, height=self.ec_app_ui.entry_height, width = self.ec_app_ui.entry_width)
self.button_details_save_initial_value = customtkinter.CTkButton(self.ec_app_ui.page_frame
, text="✔️ Save", command=self.btn_details_save_initial_value,
fg_color=self.ec_app_ui.comp_btn_colour, font = self.ec_app_ui.font2
, height=self.ec_app_ui.entry_height, width = self.ec_app_ui.entry_width)
[docs]
def clear_details(self):
"""Clears all the visual elements of the table
"""
self.label_details_title.grid_forget()
self.label_details_set_seed.grid_forget()
self.entry_details_set_seed.grid_forget()
self.label_details_set_iterations.grid_forget()
self.entry_details_set_iterations.grid_forget()
self.button_details_save.grid_forget()
self.label_details_agent_parameters.grid_forget()
self.label_details_intial_value.grid_forget()
self.entry_details_initial_value.grid_forget()
self.button_details_save_initial_value.grid_forget()
### Details Tab ###
[docs]
def details_tab_btn(self):
"""Places widgets when user opens model details page.
"""
self.ec_app_ui.clear_all()
self.label_details_title.grid(row = 0, column = 0)
self.entry_details_set_iterations.delete(0,'end')
self.entry_details_set_seed.delete(0,'end')
self.label_details_set_seed.grid(row = 0, column = 0,padx = 150,pady = 5,sticky="W")
self.entry_details_set_seed.grid(row = 0, column = 1,pady = 5)
self.label_details_set_iterations.grid(row = 1, column = 0,padx = 150,pady = 5,sticky="W")
self.entry_details_set_iterations.grid(row = 1, column = 1,pady = 5)
self.button_details_save.grid(row = 2, column = 1,pady = 5)
[docs]
def btn_details_save(self):
"""Save details about model to the backend
"""
seed = self.entry_details_set_seed.get()
iterations = self.entry_details_set_iterations.get()
self.agents = self.ec_app_ui.new_model.get_model_details().get_list_num_agents()
self.parameters = self.ec_app_ui.new_model.get_model_details().get_list_initial_parameters()
if seed == "":
seed = None
self.ec_app_ui.new_model.edit_model_details(sim_seed=seed, sim_length=iterations)
self.current_initial_parameter = self.agents.pop(0)
header = "Enter The Initial Number of "+(self.current_initial_parameter)+" Agents:"
self.label_details_agent_parameters.config(text=header)
self.is_agent = True
self.label_details_agent_parameters.grid(row = 3, column = 0,padx = 150,pady = 5,sticky="W"
, columnspan=2)
self.label_details_intial_value.grid(row = 4, column = 0,padx = 150,pady = 5,sticky="W")
self.entry_details_initial_value.grid(row = 4, column = 1,pady = 5)
self.button_details_save_initial_value.grid(row = 5, column = 1,pady = 5)
self.button_details_save.grid_forget()
[docs]
def btn_details_save_initial_value(self):
"""Saves the intial value of the given initial value
"""
value_num = self.entry_details_initial_value.get()
model_details = self.ec_app_ui.new_model.get_model_details()
if self.is_agent:
model_details.edit_num_agent(self.current_initial_parameter, value_num)
else:
model_details.edit_initial_parameter(self.current_initial_parameter
, initial_parameter_value = value_num)
self.entry_details_initial_value.delete(0, 'end')
if len(self.agents)>0:
header = f"Enter The Initial Number of {self.agents[0]} Agents:"
self.label_details_agent_parameters.config(text=header)
self.current_initial_parameter = self.agents.pop(0)
self.label_details_intial_value.grid(row = 4, column = 0,padx = 150,pady = 5,sticky="W")
self.entry_details_initial_value.grid(row = 4, column = 1,pady = 5)
self.button_details_save_initial_value.grid(row = 5, column = 1,pady = 5)
self.is_agent = True
elif len(self.parameters)>0:
header = f"Enter The Initial Value For {self.parameters[0]}"
self.label_details_agent_parameters.config(text=header)
self.current_initial_parameter = self.parameters.pop(0)
self.label_details_intial_value.grid(row = 4, column = 0,padx = 150,pady = 5,sticky="W")
self.entry_details_initial_value.grid(row = 4, column = 1,pady = 5)
self.button_details_save_initial_value.grid(row = 5, column = 1,pady = 5)
self.is_agent = False
else:
self.ec_app_ui.compile.compile_tab_btn()