Source code for interface.systems

"""
Frontend Systems Page File for AGE-ABM Visual Interface
@Author Meghan Ireland
@Co-Authors Max Hall and Matthew Fleischman

"""

import tkinter as tk
from tkinter import ttk
import customtkinter
from utils.helper_methods import getting_name_checker

[docs] class Systems: """This class defines a sytem page """ def __init__(self, ec_app_ui): """Defines the variables and widgets for systesms page. """ self.ec_app_ui = ec_app_ui self.class_component = tk.BooleanVar() self.start = tk.BooleanVar() self.end = tk.BooleanVar() self.generators = tk.BooleanVar() self.frequency = tk.BooleanVar() self.selected_primitive = tk.StringVar() self.current_generator = "" self.clicked_attribute = "" self.clicked_generator_to_delete = "" self.gen_added = False self.attr_number = None self.temp_comp_arr = None ### Frames ### self.frame_small = tk.Frame(master = self.ec_app_ui.page_frame, bg=self.ec_app_ui.frame_colour , height = self.ec_app_ui.button_height , width = 3*self.ec_app_ui.button_width//2) ### Titles ### self.label_systems_title = tk.Label(self.ec_app_ui.title_frame, text="Systems" , font=self.ec_app_ui.font1, bg=self.ec_app_ui.title_colour , fg=self.ec_app_ui.label_text_colour) self.label_systems_add_new = tk.Label(self.ec_app_ui.title_frame, text="Add New System" , font=self.ec_app_ui.font1, bg=self.ec_app_ui.title_colour , fg=self.ec_app_ui.label_text_colour) self.label_systems_edit = tk.Label(self.ec_app_ui.title_frame, text="Edit System" , font=self.ec_app_ui.font1, bg=self.ec_app_ui.title_colour , fg=self.ec_app_ui.label_text_colour) self.label_system_gen_title = tk.Label(self.ec_app_ui.title_frame, text="Add Generator" , font=self.ec_app_ui.font1, bg=self.ec_app_ui.title_colour , fg=self.ec_app_ui.label_text_colour) self.label_system_gen_value_title = tk.Label(self.ec_app_ui.title_frame, text="Add Generator Default Value" , font=self.ec_app_ui.font1, bg=self.ec_app_ui.title_colour , fg=self.ec_app_ui.label_text_colour) ### Labels ### self.label_systems_name = tk.Label(self.ec_app_ui.page_frame, text="System Name:" , font=self.ec_app_ui.font2, justify="left", bg=self.ec_app_ui.frame_colour , fg=self.ec_app_ui.label_text_colour) self.label_systems_description = tk.Label(self.ec_app_ui.page_frame, text="Description:" , font=self.ec_app_ui.font2, justify="left", bg=self.ec_app_ui.frame_colour , fg=self.ec_app_ui.label_text_colour) self.label_system_generator_name = tk.Label(self.ec_app_ui.page_frame , text="Generator Name:", font=self.ec_app_ui.font2, justify="left" , bg=self.ec_app_ui.frame_colour, fg=self.ec_app_ui.label_text_colour) self.label_system_generator_description = tk.Label(self.ec_app_ui.page_frame , text="Description:", font=self.ec_app_ui.font2, justify="left" , bg=self.ec_app_ui.frame_colour,fg=self.ec_app_ui.label_text_colour) self.label_system_add_attribute = tk.Label(self.ec_app_ui.page_frame, text="Add Attribute" , font=self.ec_app_ui.font3_underlined, justify="left",bg=self.ec_app_ui.frame_colour , fg=self.ec_app_ui.label_text_colour) self.label_system_attribute_name = tk.Label(self.ec_app_ui.page_frame , text="Attribute Name:", font=self.ec_app_ui.font2, justify="left" , bg=self.ec_app_ui.frame_colour,fg=self.ec_app_ui.label_text_colour) self.label_system_attribute_type = tk.Label(self.ec_app_ui.page_frame , text="Attribute Type:", font=self.ec_app_ui.font2, justify="left" , bg=self.ec_app_ui.frame_colour, fg=self.ec_app_ui.label_text_colour) self.label_systems_generator_return = tk.Label(self.ec_app_ui.page_frame , text="Return Value Code:", font=self.ec_app_ui.font2, justify="left" , bg=self.ec_app_ui.frame_colour,fg=self.ec_app_ui.label_text_colour) ### Entry ### self.entry_system_name = customtkinter.CTkEntry(self.ec_app_ui.page_frame , font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height , fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width , text_color = self.ec_app_ui.entry_text_colour) self.entry_system_description = customtkinter.CTkEntry(self.ec_app_ui.page_frame , font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height , fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width , text_color = self.ec_app_ui.entry_text_colour) self.entry_system_start = customtkinter.CTkEntry(self.ec_app_ui.page_frame , font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height , fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width , text_color = self.ec_app_ui.entry_text_colour) self.entry_system_end = customtkinter.CTkEntry(self.ec_app_ui.page_frame , font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height , fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width , text_color = self.ec_app_ui.entry_text_colour) self.entry_system_frequency = customtkinter.CTkEntry(self.ec_app_ui.page_frame , font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height , fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width , text_color = self.ec_app_ui.entry_text_colour) self.entry_system_generator_name = customtkinter.CTkEntry(self.ec_app_ui.page_frame , font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height , fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width , text_color = self.ec_app_ui.entry_text_colour) self.entry_system_generator_description = customtkinter.CTkEntry(self.ec_app_ui.page_frame , font = self.ec_app_ui.font2, height=self.ec_app_ui.entry_height , fg_color = self.ec_app_ui.entry_colour, width = self.ec_app_ui.entry_width , text_color = self.ec_app_ui.entry_text_colour) self.entry_system_attribute_name = customtkinter.CTkEntry(self.ec_app_ui.page_frame , font = self.ec_app_ui.font2 ,height=self.ec_app_ui.entry_height , fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width , text_color = self.ec_app_ui.entry_text_colour) self.entry_system_attr_val = customtkinter.CTkTextbox(self.ec_app_ui.page_frame , font = self.ec_app_ui.font2, height=4*self.ec_app_ui.entry_height , fg_color = self.ec_app_ui.entry_colour,width = self.ec_app_ui.entry_width , text_color = self.ec_app_ui.entry_text_colour) ### Buttons ### self.button_systems_add = customtkinter.CTkButton(self.frame_small , hover_color=self.ec_app_ui.highlight_colour, text="Add", command=self.btn_systems_add , fg_color=self.ec_app_ui.comp_btn_colour, font = self.ec_app_ui.font2 , height=self.ec_app_ui.button_height, width=self.ec_app_ui.button_width/2) self.button_systems_edit = customtkinter.CTkButton(self.frame_small , hover_color=self.ec_app_ui.highlight_colour, text="Edit" , command=self.btn_systems_edit, fg_color=self.ec_app_ui.comp_btn_colour , font = self.ec_app_ui.font2, height=self.ec_app_ui.button_height , width=self.ec_app_ui.button_width/2) self.button_systems_remove = customtkinter.CTkButton(self.frame_small , hover_color=self.ec_app_ui.highlight_colour, text="Remove" , command=self.btn_systems_remove, fg_color=self.ec_app_ui.comp_btn_colour , font = self.ec_app_ui.font2, height=self.ec_app_ui.button_height , width=self.ec_app_ui.button_width/2) self.button_systems_save = customtkinter.CTkButton(self.ec_app_ui.page_frame , hover_color=self.ec_app_ui.highlight_colour, text="✔️ Save System" , command=self.btn_systems_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_systems_save_edited = customtkinter.CTkButton(self.ec_app_ui.page_frame , hover_color=self.ec_app_ui.highlight_colour, text="✔️ Save System" , command=self.btn_systems_save_edited, 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_systems_generators = customtkinter.CTkButton(self.ec_app_ui.page_frame , hover_color=self.ec_app_ui.highlight_colour, text="Add Generator" , command=self.btn_systems_add_generator, 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_systems_done = customtkinter.CTkButton(self.ec_app_ui.page_frame , hover_color=self.ec_app_ui.highlight_colour, text="Done" , command=self.btn_systems_done, 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_system_complete_generator = customtkinter.CTkButton(self.ec_app_ui.page_frame , hover_color=self.ec_app_ui.highlight_colour, text="✔️Generator Complete" , command=self.btn_system_complete_generator, fg_color=self.ec_app_ui.comp_btn_colour , font = self.ec_app_ui.font2,height = self.ec_app_ui.button_height , width = self.ec_app_ui.entry_width) self.button_system_save_attribute = customtkinter.CTkButton(self.ec_app_ui.page_frame , hover_color=self.ec_app_ui.highlight_colour, text="Save Attribute" , command=self.btn_system_save_attribute, fg_color=self.ec_app_ui.comp_btn_colour , font = self.ec_app_ui.font2,height = self.ec_app_ui.button_height , width = self.ec_app_ui.entry_width) self.button_system_add_new_attribute = customtkinter.CTkButton(self.ec_app_ui.page_frame , hover_color=self.ec_app_ui.highlight_colour, text="➕Add New Attribute" , command=self.btn_system_add_new_attribute, fg_color=self.ec_app_ui.comp_btn_colour , font = self.ec_app_ui.font2,height = self.ec_app_ui.button_height , width = self.ec_app_ui.entry_width) self.button_generator_save = customtkinter.CTkButton(self.ec_app_ui.page_frame , hover_color=self.ec_app_ui.highlight_colour, text="Save Generator" , command=self.btn_generator_save, fg_color=self.ec_app_ui.comp_btn_colour , font = self.ec_app_ui.font2, height = self.ec_app_ui.button_height , width = self.ec_app_ui.entry_width) self.button_agents_insert_attr = customtkinter.CTkButton(self.ec_app_ui.page_frame , hover_color=self.ec_app_ui.highlight_colour, text="Insert" , command=self.btn_system_insert_attr, 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_system_save_attr_val = customtkinter.CTkButton(self.ec_app_ui.page_frame , hover_color=self.ec_app_ui.highlight_colour, text="Save Value" , command=self.btn_systems_attr_complete, 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_system_delete_gen = customtkinter.CTkButton(self.ec_app_ui.page_frame , hover_color=self.ec_app_ui.highlight_colour, text="🗑️ Delete Generator" , command=self.btn_system_delete_gen, 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_systems_add_execute = customtkinter.CTkButton(self.ec_app_ui.page_frame , hover_color=self.ec_app_ui.highlight_colour, text="Edit Execute Function", command=self.btn_execute_func , fg_color=self.ec_app_ui.comp_btn_colour, font = self.ec_app_ui.font2 , height=self.ec_app_ui.button_height, width=self.ec_app_ui.button_width/2) ### Dropdowns ### self.dropdown_system_attribute_type = customtkinter.CTkOptionMenu(self.ec_app_ui.page_frame , variable = self.selected_primitive,values=["int", "float", "bool"] , button_hover_color= self.ec_app_ui.highlight_colour , fg_color = self.ec_app_ui.dropdown_menu_color , button_color=self.ec_app_ui.comp_btn_colour, height = self.ec_app_ui.entry_height , width=self.ec_app_ui.entry_width, font = self.ec_app_ui.font2) ### Table for Systems ### self.systems_frame = customtkinter.CTkFrame(self.ec_app_ui.page_frame , fg_color=self.ec_app_ui.tbl_colour , height = 300, width = 580) self.vertical_scroll3 = tk.Scrollbar(self.systems_frame) self.systems_tbl = ttk.Treeview(self.systems_frame,padding = 5,height = 8 , yscrollcommand=self.vertical_scroll3.set) self.systems_tbl['columns'] = ('Name', 'Description') self.systems_tbl.column("#0", width=0, stretch='NO') self.systems_tbl.column("Name",anchor='center', width=190) self.systems_tbl.column("Description",anchor='center',width=380) self.systems_tbl.heading("#0",text="",anchor='center') self.systems_tbl.heading("Name",text="Name",anchor='center') self.systems_tbl.heading("Description",text="Description",anchor='center') self.systems_tbl.bind("<<TreeviewSelect>>", self.display_selected_system) ### Table for generators ### self.generators_frame = customtkinter.CTkFrame(self.ec_app_ui.page_frame , fg_color=self.ec_app_ui.tbl_colour , height = 200 , width = self.ec_app_ui.window_width/3) self.vertical_scroll2 = tk.Scrollbar(self.generators_frame) self.generators_tbl = ttk.Treeview(self.generators_frame,padding = 5,height = 4 , yscrollcommand=self.vertical_scroll2.set) self.generators_tbl['columns'] = 'Name' self.generators_tbl.column("#0", width=0, stretch='NO') self.generators_tbl.column("Name",anchor='center', width=300) self.generators_tbl.heading("#0",text="",anchor='center') self.generators_tbl.heading("Name",text="Added Generators",anchor='center') self.generators_tbl.bind("<<TreeviewSelect>>", self.display_selected_generator) ### Check box ### self.checkbox_systems_start = customtkinter.CTkCheckBox(self.ec_app_ui.page_frame, border_color=self.ec_app_ui.tbl_colour, font = self.ec_app_ui.font2, text_color = self.ec_app_ui.button_font_colour, command = self.on_tick_start,hover_color=self.ec_app_ui.highlight_colour, variable=self.start, text = "Start", fg_color = self.ec_app_ui.check_color) self.checkbox_systems_end = customtkinter.CTkCheckBox(self.ec_app_ui.page_frame, border_color=self.ec_app_ui.tbl_colour, font = self.ec_app_ui.font2, text_color = self.ec_app_ui.button_font_colour, command = self.on_tick_end,hover_color=self.ec_app_ui.highlight_colour, variable=self.end, text = "End", fg_color = self.ec_app_ui.check_color) self.checkbox_systems_frequency = customtkinter.CTkCheckBox(self.ec_app_ui.page_frame, border_color=self.ec_app_ui.tbl_colour, font = self.ec_app_ui.font2, text_color = self.ec_app_ui.button_font_colour, command = self.on_tick_frequency,hover_color=self.ec_app_ui.highlight_colour, variable=self.frequency, text = "Frequency", fg_color = self.ec_app_ui.check_color) self.checkbox_systems_generators = customtkinter.CTkCheckBox(self.ec_app_ui.page_frame, border_color=self.ec_app_ui.tbl_colour, font = self.ec_app_ui.font2, text_color = self.ec_app_ui.button_font_colour, hover_color=self.ec_app_ui.highlight_colour, command = self.on_tick_generator, variable=self.generators, text = "Generators ", fg_color = self.ec_app_ui.check_color) ### Table for generator attributes ### self.gen_attr_frame = customtkinter.CTkFrame(self.ec_app_ui.page_frame , fg_color=self.ec_app_ui.tbl_colour , height = 200 , width = self.ec_app_ui.window_width/6) self.vertical_scroll = tk.Scrollbar(self.gen_attr_frame) self.gen_attr_tbl = ttk.Treeview(self.gen_attr_frame,padding = 5,height=4 , yscrollcommand=self.vertical_scroll.set) self.gen_attr_tbl['columns'] = 'Attribute' self.gen_attr_tbl.column("#0", width=0, stretch='NO') self.gen_attr_tbl.column("Attribute",anchor='center',width=300) self.gen_attr_tbl.heading("#0",text="",anchor='center') self.gen_attr_tbl.heading("Attribute",text="Attribute",anchor='center') self.gen_attr_tbl.bind("<<TreeviewSelect>>", self.display_selected_attribute) ### Selection Variable ### self.selected_system = ""
[docs] def clear_systems(self): """Clears the systems page """ self.label_systems_title.grid_forget() self.systems_frame.grid_forget() self.systems_tbl.pack_forget() self.button_systems_add.grid_forget() self.button_systems_edit.grid_forget() self.button_systems_remove.grid_forget() self.label_systems_edit.grid_forget()
[docs] def clear_add_system(self): """Clears adding a system's page """ self.label_systems_add_new.grid_forget() self.label_systems_name.grid_forget() self.entry_system_name.grid_forget() self.label_systems_description.grid_forget() self.entry_system_description.grid_forget() self.button_systems_save.grid_forget() self.button_systems_save_edited.grid_forget() self.button_systems_generators.grid_forget() self.entry_system_frequency.grid_forget() self.entry_system_end.grid_forget() self.entry_system_start.grid_forget() self.checkbox_systems_generators.grid_forget() self.checkbox_systems_start.grid_forget() self.checkbox_systems_end.grid_forget() self.checkbox_systems_frequency.grid_forget() self.button_systems_done.grid_forget() self.gen_attr_frame.grid_forget() self.gen_attr_tbl.pack_forget() self.button_agents_insert_attr.grid_forget() self.entry_system_attr_val.grid_forget() self.button_system_save_attr_val.grid_forget() self.label_system_generator_name.grid_forget() self.label_system_generator_description.grid_forget() self.entry_system_generator_description.grid_forget() self.entry_system_generator_name.grid_forget() self.button_system_add_new_attribute.grid_forget() self.button_system_complete_generator.grid_forget() self.generators_frame.grid_forget() self.generators_tbl.pack_forget() self.button_system_delete_gen.grid_forget() self.frame_small.grid_forget() self.label_system_gen_title.grid_forget() self.label_system_gen_value_title.grid_forget() self.button_systems_add_execute.grid_forget() self.label_system_add_attribute.grid_forget() self.label_system_attribute_name.grid_forget() self.label_system_add_attribute.grid_forget() self.entry_system_attribute_name.grid_forget() self.label_system_attribute_type.grid_forget() self.dropdown_system_attribute_type.grid_forget() self.button_system_save_attribute.grid_forget()
### Systems Tab ###
[docs] def systems_tab_btn(self): """Sets up the systems page with the table """ ### Enable buttons and entry boxes ### self.entry_system_name.configure(state = "normal") self.entry_system_description.configure(state = "normal") self.entry_system_start.configure(state = "normal") self.entry_system_end.configure(state = "normal") self.entry_system_frequency.configure(state = "normal") self.checkbox_systems_start.configure(state = "normal") self.checkbox_systems_end.configure(state = "normal") self.checkbox_systems_frequency.configure(state = "normal") self.entry_system_name.delete(0, 'end') self.entry_system_description.delete(0, 'end') self.entry_system_start.delete(0, 'end') self.entry_system_end.delete(0, 'end') self.entry_system_frequency.delete(0, 'end') self.ec_app_ui.clear_all() self.selected_system = "" self.gen_added = False id5 = 0 for sys in self.systems_tbl.get_children(): self.systems_tbl.delete(sys) system_names = self.ec_app_ui.new_model.get_list_systems() for sys in system_names: system = self.ec_app_ui.new_model.get_system(sys) self.systems_tbl.insert(parent='',index="end",iid=id5, text='',values=(sys, system.get_description())) id5+=1 self.label_systems_title.grid(row = 0, column = 0) ### Table ### self.systems_frame.grid(row = 0,columnspan = 3,column = 0,pady = (40,5)) self.vertical_scroll3.pack(side="right", fill="y", padx=(0,5), pady=5) self.systems_tbl.pack(fill = "x", padx = (5,0), pady = 5) ### Add, edit, remove buttons ### self.frame_small.grid(row=2, column = 0, columnspan=3,pady = 5) self.button_systems_add.grid(row = 0,column = 0,padx = 5) self.button_systems_edit.grid(row = 0, column = 1,padx = 5) self.button_systems_remove.grid(row = 0, column = 2,padx = 5) self.button_systems_add_execute.grid(row = 3, column = 0, columnspan=3)
[docs] def btn_systems_add(self): """Method when user clicks add system, places widgets user will need to do so. """ self.ec_app_ui.clear_all() self.entry_system_name.configure(state = "normal") self.entry_system_description.configure(state = "normal") self.entry_system_name.delete(0, 'end') self.entry_system_description.delete(0, 'end') ### Title ### self.label_systems_add_new.grid(row = 0, column = 0) ### Check if a generator has been added ### if self.gen_added: ### Name ### self.entry_system_name.insert(0, self.selected_system) self.entry_system_description.insert(0, self.ec_app_ui.new_model.get_system(str(self.selected_system)).get_description()) self.generators_frame.grid(row = 0, column = 3,padx = 5, pady = 5, sticky="W" , rowspan = 5) self.vertical_scroll2.pack(side="right", fill="y", padx=(0,5), pady=5) self.generators_tbl.pack(fill = "x", padx = (5,0), pady = 5) ### Disable buttons ### self.entry_system_name.configure(state = "disabled") self.entry_system_description.configure(state = "disabled") self.entry_system_start.configure(state = "disabled") self.entry_system_end.configure(state = "disabled") self.entry_system_frequency.configure(state = "disabled") self.checkbox_systems_start.configure(state = "disabled") self.checkbox_systems_end.configure(state = "disabled") self.checkbox_systems_frequency.configure(state = "disabled") system_model = self.ec_app_ui.new_model.get_system(str(self.selected_system)) ### Start ### if system_model.get_start() is not None: self.checkbox_systems_start.select() self.entry_system_start.delete(0, 'end') self.entry_system_start.insert(0, system_model.get_start()) self.on_tick_start() else: self.checkbox_systems_start.deselect() ### End ### if system_model.get_end() is not None: self.checkbox_systems_end.select() self.entry_system_end.delete(0, 'end') self.entry_system_end.insert(0, system_model.get_end()) self.on_tick_end() else: self.checkbox_systems_end.deselect() ### Frequency ### if system_model.get_frequency() is not None: self.checkbox_systems_frequency.select() self.entry_system_frequency.delete(0, 'end') self.entry_system_frequency.insert(0, system_model.get_frequency()) self.on_tick_frequency() else: self.checkbox_systems_frequency.deselect() ### Generators ### self.checkbox_systems_generators.grid(row = 6, column = 0,padx = 150, pady = 5 , sticky="W") self.checkbox_systems_generators.select() self.checkbox_systems_generators.configure(state = "disabled") self.on_tick_generator() ### Add done button ### self.button_systems_done.grid(row = 7, column = 2,pady = 5) else: ### Start ### self.entry_system_start.delete(0, 'end') self.checkbox_systems_start.deselect() ### End ### self.entry_system_end.delete(0, 'end') self.checkbox_systems_end.deselect() ### Frequency ### self.entry_system_frequency.delete(0, 'end') self.checkbox_systems_frequency.deselect() ### Generators ### self.checkbox_systems_generators.deselect() ### Enable entry boxes ### self.entry_system_name.configure(state = "normal") self.entry_system_description.configure(state = "normal") self.entry_system_start.configure(state = "normal") self.entry_system_end.configure(state = "normal") self.entry_system_frequency.configure(state = "normal") self.checkbox_systems_start.configure(state = "normal") self.checkbox_systems_end.configure(state = "normal") self.checkbox_systems_frequency.configure(state = "normal") ### Save Button ### self.button_systems_save.grid(row = 5, column = 2,pady = 5) ### Name ### self.label_systems_name.grid(row = 0, column = 0,padx = 150,pady = 5,sticky="W") self.entry_system_name.grid(row = 0, column = 2,pady = 5) ### Description ### self.label_systems_description.grid(row = 1, column = 0,padx = 150,pady = 5,sticky="W") self.entry_system_description.grid(row = 1, column = 2,pady = 5) ### Start ### self.checkbox_systems_start.grid(row = 2, column = 0,padx = 150,pady = 5,sticky="W") ### End ### self.checkbox_systems_end.grid(row = 3, column = 0,padx = 150,pady = 5,sticky="W") ### Frequency ### self.checkbox_systems_frequency.grid(row = 4, column = 0,padx = 150,pady = 5,sticky="W") ### Generator Table ### generator_tbl_id = 0 for sys in self.generators_tbl.get_children(): self.generators_tbl.delete(sys) if not self.selected_system == "": generator_names = self.ec_app_ui.new_model.get_list_generators(self.selected_system) for gen in generator_names: self.generators_tbl.insert(parent='',index="end",iid=generator_tbl_id, text='',values=(gen, )) generator_tbl_id+=1
[docs] def btn_systems_save(self): """Saves the entered system details to the backend. """ ### Add system to backend ### self.ec_app_ui.new_model.add_system(self.entry_system_name.get(), self.entry_system_description.get()) self.selected_system = getting_name_checker(self.entry_system_name.get() , self.ec_app_ui.new_model.get_list_systems()) if self.checkbox_systems_start.get(): self.ec_app_ui.new_model.edit_system(self.selected_system , start = self.entry_system_start.get()) if self.checkbox_systems_end.get(): self.ec_app_ui.new_model.edit_system(self.selected_system , end = self.entry_system_end.get()) if self.checkbox_systems_frequency.get(): self.ec_app_ui.new_model.edit_system(self.selected_system , frequency = self.entry_system_frequency.get()) ### Place Generator check button and make it not selected ### self.checkbox_systems_generators.grid(row = 6, column = 0,padx = 150,pady = 5,sticky="W") self.checkbox_systems_generators.deselect() self.checkbox_systems_generators.configure(state = "normal") ### Add done button ### self.button_systems_done.grid(row = 7, column = 2,pady = 5) ### Disable Buttons ### self.entry_system_name.configure(state = "disabled") self.entry_system_description.configure(state = "disabled") self.entry_system_start.configure(state = "disabled") self.entry_system_end.configure(state = "disabled") self.entry_system_frequency.configure(state = "disabled") self.checkbox_systems_start.configure(state = "disabled") self.checkbox_systems_end.configure(state = "disabled") self.checkbox_systems_frequency.configure(state = "disabled") ### Remove save button ### self.button_systems_save.grid_forget()
[docs] def btn_systems_edit(self): """Allows a user to edit selected system. """ if self.selected_system!= "": self.ec_app_ui.clear_all() ### Title ### self.label_systems_edit.grid(row = 0, column = 0) ### Check if a generator has been added ### ### Save Button ### self.button_systems_save_edited.grid(row = 5, column = 2,pady = 5) if len(self.ec_app_ui.new_model.get_list_generators(self.selected_system)) != 0: ### Place generator things ### self.checkbox_systems_generators.select() self.on_tick_generator() else: self.checkbox_systems_generators.deselect() ### Generators ### self.checkbox_systems_generators.grid(row = 6, column = 0,padx = 150,pady = 5,sticky="W") self.checkbox_systems_generators.configure(state = "enabled") ### Name ### self.entry_system_name.configure(state = "normal") self.entry_system_description.configure(state = "normal") self.entry_system_name.insert(0, self.selected_system) self.entry_system_description.insert(0, self.ec_app_ui.new_model.get_system(str(self.selected_system)).get_description()) self.generators_frame.grid(row = 0, column = 3,padx = 5, pady = 5, sticky="W", rowspan = 5) self.vertical_scroll2.pack(side="right", fill="y", padx=(0,5), pady=5) self.generators_tbl.pack(fill = "x", padx = (5,0), pady = 5) ### Enable buttons ### self.entry_system_name.configure(state = "disabled") system_model = self.ec_app_ui.new_model.get_system(str(self.selected_system)) ### Start ### if system_model.get_start() is not None: self.checkbox_systems_start.select() self.entry_system_start.delete(0, 'end') self.entry_system_start.insert(0, system_model.get_start()) self.on_tick_start() else: self.checkbox_systems_start.deselect() ### End ### if system_model.get_end() is not None: self.checkbox_systems_end.select() self.entry_system_end.delete(0, 'end') self.entry_system_end.insert(0, system_model.get_end()) self.on_tick_end() else: self.checkbox_systems_end.deselect() ### Frequency ### if system_model.get_frequency() is not None: self.checkbox_systems_frequency.select() self.entry_system_frequency.delete(0, 'end') self.entry_system_frequency.insert(0, system_model.get_frequency()) self.on_tick_frequency() else: self.checkbox_systems_frequency.deselect() ### Add done button ### self.button_systems_done.grid(row = 7, column = 2,pady = 5) ### Name ### self.label_systems_name.grid(row = 0, column = 0,padx = 150,pady = 5,sticky="W") self.entry_system_name.grid(row = 0, column = 2,pady = 5) ### Description ### self.label_systems_description.grid(row = 1, column = 0,padx = 150,pady = 5,sticky="W") self.entry_system_description.grid(row = 1, column = 2,pady = 5) ### Start ### self.checkbox_systems_start.grid(row = 2, column = 0,padx = 150,pady = 5,sticky="W") ### End ### self.checkbox_systems_end.grid(row = 3, column = 0,padx = 150,pady = 5,sticky="W") ### Frequency ### self.checkbox_systems_frequency.grid(row = 4, column = 0,padx = 150,pady = 5,sticky="W") ### Generator Table ### generator_tbl_id = 0 for sys in self.generators_tbl.get_children(): self.generators_tbl.delete(sys) if not self.selected_system == "": generator_names = self.ec_app_ui.new_model.get_list_generators(self.selected_system) for gen in generator_names: self.generators_tbl.insert(parent='',index="end",iid=generator_tbl_id, text='',values=(gen, )) generator_tbl_id+=1
[docs] def btn_systems_save_edited(self): """Edited systems save on this method call """ self.ec_app_ui.new_model.edit_system(self.selected_system, description = self.entry_system_description.get()) self.entry_system_name.configure(state= "normal") ### Disable Buttons ### self.entry_system_name.configure(state = "disabled") self.entry_system_description.configure(state = "disabled") self.entry_system_start.configure(state = "disabled") self.entry_system_end.configure(state = "disabled") self.entry_system_frequency.configure(state = "disabled") self.checkbox_systems_start.configure(state = "disabled") self.checkbox_systems_end.configure(state = "disabled") self.checkbox_systems_frequency.configure(state = "disabled") if self.checkbox_systems_start.get(): self.ec_app_ui.new_model.edit_system(self.selected_system , start = self.entry_system_start.get()) else: self.ec_app_ui.new_model.get_system(self.selected_system).remove_start() if self.checkbox_systems_end.get(): self.ec_app_ui.new_model.edit_system(self.selected_system , end = self.entry_system_end.get()) else: self.ec_app_ui.new_model.get_system(self.selected_system).remove_end() if self.checkbox_systems_frequency.get(): self.ec_app_ui.new_model.edit_system(self.selected_system , frequency = self.entry_system_frequency.get()) else: self.ec_app_ui.new_model.get_system(self.selected_system).remove_frequency() self.button_systems_save_edited.grid_forget() self.button_systems_done.grid(row = 7, column = 2,pady = 5)
[docs] def btn_systems_remove(self): """Allows a user to delete selected system. """ self.ec_app_ui.new_model.remove_system(self.selected_system) self.systems_tab_btn()
[docs] def display_selected_system(self, *args): """Saves the system the user clicked on. """ selected_items = self.systems_tbl.selection() if selected_items: selected_item = self.systems_tbl.selection()[0] self.selected_system = self.systems_tbl.item(selected_item)['values'][0]
[docs] def on_tick_start(self, *args): """When user clicks start checkbox """ if self.checkbox_systems_start.get(): ### Place entry box ### self.entry_system_start.grid(row = 2, column = 2,pady = 5) else: self.entry_system_start.grid_forget()
[docs] def on_tick_end(self, *args): """When user clicks end checkbox """ if self.checkbox_systems_end.get(): ### Place entry box ### self.entry_system_end.grid(row = 3, column = 2,pady = 5) else: self.entry_system_end.grid_forget()
[docs] def on_tick_frequency(self, *args): """When user clicks frequency checkbox """ if self.checkbox_systems_frequency.get(): ### Place entry box ### self.entry_system_frequency.grid(row = 4, column = 2,pady = 5) else: self.entry_system_frequency.grid_forget()
[docs] def on_tick_generator(self, *args): """When user clicks generator checkbox """ if self.checkbox_systems_generators.get(): ### Place button ### self.button_systems_generators.grid(row = 6, column = 2,pady = 5) else: ### Remove Button ### self.button_systems_generators.grid_forget()
[docs] def btn_systems_add_generator(self): """Places widgets which allow users to add a generator """ self.ec_app_ui.clear_all() self.entry_system_generator_name.configure(state = "normal") self.entry_system_generator_description.configure(state = "normal") self.entry_system_generator_name.delete(0,'end') self.entry_system_generator_description.delete(0,'end') ### Title ### self.label_system_gen_title.grid(row = 0, column = 0) ### Component name ### self.label_system_generator_name.grid(row = 0, column = 0,padx = 150,pady = 5,sticky="W") self.entry_system_generator_name.grid(row = 0, column = 2,pady = 5) ### Component description ### self.label_system_generator_description.grid(row=1, column = 0,padx = 150, pady = 5 , sticky="W") self.entry_system_generator_description.grid(row=1, column = 2,pady = 5) ### Save component ### self.button_generator_save.grid(row = 3, column = 2,pady = 5) ### Change the number of attributes ### self.attr_number = 0 self.label_system_add_attribute.config(text="Add Attribute "+str(self.attr_number))
### Add generators ###
[docs] def btn_system_save_attribute(self): """Saves attribute to component """ ### system, generator, type, attribute self.ec_app_ui.new_model.add_gen_attribute(self.selected_system , self.entry_system_generator_name.get() , self.entry_system_attribute_name.get() , self.dropdown_system_attribute_type.get()) ### Now that the new attribute has been saved we allow the user to click add new attribute or complete # Remove widgets: self.label_system_add_attribute.grid_forget() self.label_system_attribute_name.grid_forget() self.label_system_add_attribute.grid_forget() self.entry_system_attribute_name.grid_forget() self.label_system_attribute_type.grid_forget() self.dropdown_system_attribute_type.grid_forget() ### Add new Attribute or complete system button ### self.button_system_add_new_attribute.grid(row = 4, column = 2,pady = 5) self.button_system_complete_generator.grid(row = 5, column = 2,pady = 5) self.entry_system_attribute_name.delete(0, 'end')# This clears the attribute name entry field self.button_system_save_attribute.grid_forget()# This removes the save attribute button
[docs] def btn_system_add_new_attribute(self): """Places the widgets to allow user to add an attribute """ self.entry_system_attribute_name.delete(0, 'end') self.attr_number += 1 self.label_system_add_attribute.config(text="Add Attribute "+str(self.attr_number)) self.dropdown_system_attribute_type.set("int") ### Attribute name ### self.label_system_add_attribute.grid(row = 4, column = 0, padx = 150, pady = 5, sticky="W") self.entry_system_attribute_name.delete(0,'end') self.label_system_attribute_name.grid(row = 5, column = 0, padx = 150, pady = 5, sticky="W") self.entry_system_attribute_name.grid(row = 5, column = 2, pady = 5) ### Attribute type ### self.label_system_attribute_type.grid(row = 6, column = 0, padx = 150, pady = 5, sticky="W") self.dropdown_system_attribute_type.grid(row = 6, column = 2, pady = 5) ### Save button ### self.button_system_save_attribute.grid(row = 9, column = 2, pady = 5) self.button_system_add_new_attribute.grid_forget() self.button_system_complete_generator.grid_forget()
[docs] def btn_generator_save(self): """Saves the generator """ ### Add generator to model ### self.current_generator = self.entry_system_generator_name.get() self.ec_app_ui.new_model.add_generator(self.selected_system, self.current_generator, self.entry_system_generator_description.get()) self.button_generator_save.grid_forget() self.entry_system_generator_name.configure(state= "disabled") self.entry_system_generator_description.configure(state= "disabled") ### Add new attribute button and complete generator button ### self.button_system_add_new_attribute.grid(row = 4, column = 2,pady = 5) self.button_system_complete_generator.grid(row = 5, column = 2,pady = 5)
[docs] def btn_system_complete_generator(self): """Clears entry boxes """ self.ec_app_ui.clear_all() self.label_system_gen_value_title.grid(row=0, column=0) self.entry_system_name.delete(0, 'end')# This clears the component name entry field self.entry_system_description.delete(0, 'end')# Clears the component description entry field self.entry_system_attribute_name.delete(0,'end') ### Clear table ### for attr in self.gen_attr_tbl.get_children(): self.gen_attr_tbl.delete(attr) ### Populate table ### attributes_id = 0 system = self.selected_system for val in self.ec_app_ui.new_model.get_list_gen_attributes(system, self.current_generator): self.gen_attr_tbl.insert(parent='',index="end", iid=attributes_id,text='', values=(val,)) attributes_id += 1 self.temp_comp_arr = [] ### Place Table ### self.gen_attr_frame.grid(row = 0, column = 0, rowspan = 6, pady = 5, padx = (40,5)) self.vertical_scroll.pack(side="right", fill="y", padx=(0,5), pady=5) self.gen_attr_tbl.pack(fill = "x", padx = (5,0), pady = 5) ### Insert button ### self.button_agents_insert_attr.grid(row = 6, column = 0, pady = 5, padx = (40,5)) ### Entry ### self.entry_system_attr_val.delete("1.0", 'end-1c') self.entry_system_attr_val.insert("1.0", "{value} if {condition} else {value}") self.entry_system_attr_val.grid(row = 1, column = 1, pady = 5, padx = 5) ### Save Button ### self.button_system_save_attr_val.grid(row = 2, column = 1, pady = 5, padx = 5)
[docs] def btn_systems_done(self): """Clears page and takes user back to systems main page """ self.systems_tab_btn()
[docs] def display_selected_attribute(self, *args): """Saves the attribute the user clicked on. """ self.clicked_attribute = "" selected_items = self.gen_attr_tbl.selection() if selected_items: selected_item = self.gen_attr_tbl.selection()[0] self.clicked_attribute = self.gen_attr_tbl.item(selected_item)['values'][0]
[docs] def btn_system_insert_attr(self): """Adds the specified attribute to the attribute value """ self.entry_system_attr_val.insert(tk.END, "$"+str(self.clicked_attribute)+"$")
[docs] def btn_systems_attr_complete(self): """Allows Users to add agent level attributes, saves them to backend in required format """ value = self.entry_system_attr_val.get("1.0", 'end-1c') if value != "{value} if {condition} else {value}": system = self.selected_system for val in self.ec_app_ui.new_model.get_list_gen_attributes(system, self.current_generator): specific_string = f"${val}$" value = value.replace(specific_string, f"{system.upper()}_{self.current_generator.upper()}_{val.upper()}") self.ec_app_ui.new_model.edit_generator(system, self.current_generator , return_value = value) self.entry_system_attr_val.grid_forget() self.button_system_save_attr_val.grid_forget() self.selected_system = system self.gen_added = True self.btn_systems_add()
[docs] def display_selected_generator(self, *args): """Gets the generator a user has clicked so it can be deleted """ ### Place Delete button ### self.button_system_delete_gen.grid(row = 5, column = 3,padx = 5, pady = 5) ### Get selected generator ### self.clicked_generator_to_delete = "" selected_items = self.generators_tbl.selection() if selected_items: selected_item = self.generators_tbl.selection()[0] self.clicked_generator_to_delete = self.generators_tbl.item(selected_item)['values'][0]
[docs] def btn_system_delete_gen(self): """Deletes the generator a user has clicked to be removed """ self.ec_app_ui.new_model.remove_generator((self.selected_system) , self.clicked_generator_to_delete) for sys in self.generators_tbl.get_children(): self.generators_tbl.delete(sys) generator_tbl_id = 0 if not self.selected_system == "": generator_names = self.ec_app_ui.new_model.get_list_generators(self.selected_system) for gen in generator_names: self.generators_tbl.insert(parent='',index="end",iid=generator_tbl_id, text='',values=(gen, )) generator_tbl_id+=1
[docs] def btn_execute_func(self): """Takes user to execute page """ if self.selected_system != "": self.ec_app_ui.execute.opened_from_systems(self.selected_system)