def initUI(self, server): self.parent.title("TrackWise Service Manager") self.pack(fill=BOTH, expand = True, padx = 300) # self.centerWindow() menubar = Menu(self.parent) self.parent.config(menu = menubar) fileMenu = Menu(menubar) fileMenu.add_command(label = "Exit", command = self.onExit) menubar.add_cascade(label = "File", menu = fileMenu) svcsMenu = Menu(menubar) svcsMenu.add_command(label = "List Service Status", command = self.onStatus) svcsMenu.add_command(label = "Stop Services", command = self.onStop) svcsMenu.add_command(label = "Start Services", command = self.onStart) menubar.add_cascade(label = "Services", menu = svcsMenu) # svcs = ['TrackWise Tomcat', 'Web Services Tomcat', 'QMD Tomcat', 'Keystone Intake', 'ID Intake', 'TWC'] svcs = server.getservices() hostname = server.gethostname().strip() servertype = server.gettype().strip() frame0 = Labelframe(self, text = "Server Details", borderwidth = 1) frame0.grid(column = 0, row = 0, sticky = W) so = StringVar() svroverview = Message(frame0, textvariable = so, anchor = W, width = 300) svroverview.grid(column = 0, row = 0) sstr = "Server: {}\n".format(hostname) sstr += "Server Type: {}".format(servertype) so.set(sstr) frame1 = Labelframe(self, text = "Service Status", borderwidth = 1) frame1.grid(column = 0, row = 1, sticky = W) l = StringVar() label1 = Message(frame1, textvariable = l , anchor = W) svcscount = 0 lstr = "" for i in svcs: svcscount += 1 lstr += '{} - '.format(i) + ('UP\n' if svcscount % 2 else 'DOWN\n') l.set(lstr) label1.pack(side=TOP, padx = 5, pady = 5) frame4 = Frame(self, relief=RAISED, borderwidth = 1) frame4.grid(column = 0, row = 2, sticky = W) closeButton = Button(frame4, text="Close", command = self.quit) closeButton.grid(column = 0, row = 0) okButton = Button(frame4, text = "OK") okButton.grid(column = 1, row = 0)
def GUIwindow_data(): global arm window = tkinter.Tk() window.title("Patient's data") #-----Patient data patient_data = Labelframe(window, borderwidth=1, text='Patient Data') patient_data.grid(row=0, column=0, sticky='NW') # Patient name pat_namelbl = tkinter.Label(patient_data, text="Name") pat_namelbl.grid(sticky='NW') var_name = tkinter.StringVar() patient_name = tkinter.Entry(patient_data, textvariable=var_name) patient_name.grid(sticky='NW') # Patient age pat_agelbl = tkinter.Label(patient_data, text="Age") pat_agelbl.grid(sticky='W') var_age = tkinter.StringVar() patient_age = tkinter.Entry(patient_data, textvariable=var_age) patient_age.grid(sticky='W') #Radiobutton for left or right arm arm = tkinter.IntVar() armlbl = tkinter.Label(patient_data, text="Which arm is being studied ?") armlbl.grid(sticky='W') tkinter.Radiobutton(patient_data, text="Left arm", variable=arm, value=1).grid(sticky='W') tkinter.Radiobutton(patient_data, text="Right arm", variable=arm, value=2).grid(sticky='W') def win_des(): global pat_name, pat_age pat_name = patient_name.get() pat_age = patient_age.get() window.destroy() # buttons exit and OK btn_exit = tkinter.Button(window, text="Exit", command=sys.exit, fg='red') btn_exit.grid(row=2, column=0, sticky='sw') btn_ok = tkinter.Button(window, text="Start", command=win_des, fg='green') btn_ok.grid(row=2, column=2, sticky='se') window.mainloop()
class Parameters_wind(object): #Here y= row and x = column def __init__(self, master): self._rules = "RL" self._Game = [] self._indice = 0 frame = Frame(master) frame.grid() tabControl = ttk.Notebook(master) tabControl.configure(width=420, height=600) self.main_tab = ttk.Frame(tabControl) tabControl.add(self.main_tab, text="Settings") tabControl.grid() self.about_tab = ttk.Frame(tabControl) tabControl.add(self.about_tab, text="About") tabControl.grid() self.dimension = IntVar() self.dimension.set(value=50) self.chkValue = BooleanVar() self.chkValue.set(True) self.chkValue_two = BooleanVar() self.chkValue_two.set(False) self.nbr_of_ant = IntVar() self.nbr_of_ant.set(value=1) self.speed_opts = ['0', '1000', '500', '250', '100', '50', '10', '0'] self.speed = StringVar() self.black_case_nbr = IntVar() self.black_case_nbr.set(value=0) self.about_page() self.main_page() def main_page(self): self.label_dimension = Label( self.main_tab, text="How many rows and columns do you want ?") self.label_dimension.grid(column=0, row=0, sticky='w') self.scale_dimension = Scale(self.main_tab, orient='horizontal', from_=25, to=200, variable=self.dimension, tickinterval=25, length=200) self.scale_dimension.grid(column=0, row=1, padx=5, pady=5) self.frame_dimension = Labelframe(self.main_tab, text="Order of ideas :", height=60, width=300) self.frame_dimension.grid(column=0, row=2, sticky='w') dimension_frame_label = [ "<50 this is a bit small", "50<x<150 ideal dimension", ">150 quite such huge" ] for i in range(len(dimension_frame_label)): texte = dimension_frame_label[i] self.dimension_frame_label = Label(self.frame_dimension, text=f"{texte}") self.dimension_frame_label.grid(column=0, row=i, sticky='w') self.dimension_frame_label.grid(column=0, row=2, sticky='w') self.label_ant = Label(self.main_tab, text="How many ant(s) do you want ?") self.label_ant.grid(column=0, row=3, sticky='w') self.scale_ant = Scale(self.main_tab, orient='horizontal', from_=1, to=10, variable=self.nbr_of_ant, tickinterval=2, length=200) self.scale_ant.grid(column=0, row=4, padx=5, pady=5) self.speed_label = Label(self.main_tab, text="Delay in millisecond :") self.speed_label.grid(column=0, row=5, sticky='w') self.speed_menu = OptionMenu(self.main_tab, self.speed, *self.speed_opts) self.speed_menu.grid(column=1, row=5, sticky='w') self.black_case_label = Label(self.main_tab, text="Percentage of black cells :") self.black_case_label.grid(column=0, row=6, sticky='w') self.black_case = Scale(self.main_tab, orient='horizontal', from_=0, to=99, variable=self.black_case_nbr, tickinterval=10, length=200) self.black_case.grid(column=0, row=7, padx=5, pady=5) self.frame_rules = Labelframe(self.main_tab, text="Rules setting:", height=100, width=400) self.frame_rules.grid(column=0, row=8, sticky='w') self.label_rules = Label(self.frame_rules, text="Rules :" + str(self._rules)) self.label_rules.grid(column=0, row=0, sticky='w', columnspan=3) self.button_F = Button(self.frame_rules, text="F", command=self.F) self.button_F.grid(column=1, row=1, padx=5, pady=5) self.button_L = Button(self.frame_rules, text="L", command=self.L) self.button_L.grid(column=0, row=2, padx=5, pady=5) self.button_clean = Button(self.frame_rules, text="Clean", command=self.clean) self.button_clean.grid(column=1, row=2, padx=5, pady=5) self.button_R = Button(self.frame_rules, text="R", command=self.R) self.button_R.grid(column=2, row=2, padx=5, pady=5) self.button_B = Button(self.frame_rules, text="B", command=self.B) self.button_B.grid(column=1, row=3, padx=5, pady=5) self.chk = Checkbutton(self.main_tab, text='Grid', var=self.chkValue) self.chk.grid(column=0, row=9) self.chk_two = Checkbutton(self.main_tab, text='Desctructive collision', var=self.chkValue_two) self.chk_two.grid(column=1, row=9) self.button_simulator = Button(self.main_tab, text="Go to simulation auto", command=self.simulation_ants) self.button_simulator.grid(column=0, row=10) self.button_simulator_steps = Button( self.main_tab, text="Go to simulation step by step", command=self.simulation_steps) self.button_simulator_steps.grid(column=1, row=10, pady=15) def about_page(self): self.ligne = 0 about_label = [ "Students in the project :", " -Esteban Mathia", " -Victor Minne", " -Tom Cleenewerck" ] for i in range(len(about_label)): texte = about_label[i] self.about_label = Label(self.about_tab, text=f"{texte}") self.about_label.grid(column=0, row=self.ligne, sticky='w') self.ligne += 1 esteban = [ "Esteban :", " +33675549372", " [email protected]" ] victor = ["Victor :", " +33611815452", " [email protected]"] tom = ["Tom :", " +33750370032", " [email protected]"] info_contribuator = [esteban, victor, tom] for i in range(len(info_contribuator)): for j in range(len(info_contribuator[i])): texte = info_contribuator[i][j] self.about_label = Label(self.about_tab, text=f"{texte}") self.about_label.grid(column=0, row=self.ligne, sticky='w') self.ligne += 1 def F(self): if len(self._rules) < 12: self._rules += "F" else: messagebox.showinfo("Info", "You arrive to maximum rules") self.actu_rules() def L(self): if len(self._rules) < 12: self._rules += "L" else: messagebox.showinfo("Info", "You arrive to maximum rules") self.actu_rules() def R(self): if len(self._rules) < 12: self._rules += "R" else: messagebox.showinfo("Info", "You arrive to maximum rules") self.actu_rules() def B(self): if len(self._rules) < 12: self._rules += "B" else: messagebox.showinfo("Info", "You arrive to maximum rules") self.actu_rules() def clean(self): self._rules = "" self.actu_rules() def actu_rules(self): self.label_rules.config(text="Rules :" + str(self._rules)) def simulation_ants(self): if len(self._rules) > 0: threading._start_new_thread(self.new_board, ()) self._Game.append("") time.sleep(0.2) self._indice += 1 else: messagebox.showwarning( "Warning", "The Rules are incorrect, please complete it") def new_board(self): row = self.dimension.get() column = self.dimension.get() number_of_ant = self.nbr_of_ant.get() speed = int(self.speed.get()) / 1000 percentage = self.black_case_nbr.get() border = self.chkValue.get() collision = self.chkValue_two.get() self._Game[self._indice] = Board_multiple_ants(collision, self._rules, border, self._indice, row, column, percentage, number_of_ant, speed) def simulation_steps(self): if len(self._rules) > 0: threading._start_new_thread(self.new_board_steps, ()) self._Game.append("") time.sleep(0.2) self._indice += 1 else: messagebox.showwarning( "Warning", "The Rules are incorrect, please complete it") def new_board_steps(self): row = self.dimension.get() column = self.dimension.get() number_of_ant = self.nbr_of_ant.get() percentage = self.black_case_nbr.get() border = self.chkValue.get() collision = self.chkValue_two.get() self._Game[self._indice] = Simulator_steps(collision, self._rules, self._indice, row, column, percentage, number_of_ant, border)
class Simulator_steps(): def __init__(self, collision, rules, indice, row, col, percentage, number_of_ant, border): self.rules = rules self.label_one_var = StringVar() self.label_two_var = StringVar() self.col = col self._win_ant = Tk() self._steps = 0 self.indice = indice self._win_ant.title( f"Langton's ant simulation {indice} step {self._steps}") self._win_ant.geometry("1000x800") self._win_ant.resizable(False, True) self._screen_size = 800 self._game = Board_steps(collision, rules, row, col, percentage, number_of_ant) self._board_real, self.coordonate_of_ants, self._steps = self._game.returnn( ) number_of_ant, number_of_cell = self._game.info() self.dimension = IntVar() self.dimension.set(value=50) #The table stores the objects displayed on the screen self._board = [[0] * col for _ in range(0, row)] #The size of a cell in pixels self._px = self._screen_size // col self._py = self._screen_size // row #The canvas is created from the previous values self._frame_dimension = Labelframe(self._win_ant, text="Simulation :", height=60, width=300) self._frame_dimension.grid(column=0, columnspan=4, row=0, rowspan=2, sticky='w') self._monCanvas = Canvas(self._frame_dimension, width=self._screen_size, height=self._screen_size, bg='ivory') self._monCanvas.pack() if border: for y in range(0, row): for x in range(0, col): self._board[y][x] = self._monCanvas.create_rectangle( x * self._px, y * self._py, x * self._px + self._px, y * self._py + self._py, fill='white', outline='black') else: for y in range(0, row): for x in range(0, col): self._board[y][x] = self._monCanvas.create_rectangle( x * self._px, y * self._py, x * self._px + self._px, y * self._py + self._py, fill='white', outline='white') self._board_real, self.coordonate_of_ants, self._steps = self._game.returnn( ) for i in range(len(self._board_real)): for j in range(len(self._board_real[0])): k = self._board_real[i][j] self._monCanvas.itemconfig(self._board[i][j], fill=k) for i in range(len(self.coordonate_of_ants)): self._monCanvas.itemconfig( self._board[self.coordonate_of_ants[i][0][0]][ self.coordonate_of_ants[i][0][1]], fill='grey') self._frame_button = Labelframe(self._win_ant, text="Steps settings :", height=60, width=300) self._frame_button.grid(column=5, row=0, sticky='w') self.scale_dimension = Scale(self._frame_button, orient='horizontal', from_=1, to=1000, variable=self.dimension, tickinterval=249, length=175) self.scale_dimension.grid(column=0, row=0, padx=5, pady=5) self.button_simulator_steps = Button(self._frame_button, text="Go forward", command=self.steps) self.button_simulator_steps.grid(column=0, row=1, pady=15) self.button_simulator_steps = Button(self._frame_button, text="Go backward", command=self.bsteps) self.button_simulator_steps.grid(column=0, row=2, pady=15) self.button_simulator_steps = Button(self._frame_button, text="Clear", command=self.clear) self.button_simulator_steps.grid(column=0, row=3, pady=15) self._monCanvas.bind("<ButtonPress-1>", self.mouseClick) self._frame_info = Labelframe(self._win_ant, text="Info :", height=60, width=300) self._frame_info.grid(column=5, row=1, sticky='w') if number_of_cell == 0 or number_of_cell == 1: self.label_one = Label(self._frame_info, text="Number of cell: " + str(number_of_cell)) self.label_one.grid(column=0, row=0, sticky='w') else: self.label_one = Label(self._frame_info, text="Number of cells: " + str(number_of_cell)) self.label_one.grid(column=0, row=0, sticky='w') if number_of_ant[1] == 0 or number_of_ant[1] == 1: self.label_two = Label(self._frame_info, text="Number of ant alive: " + str(number_of_ant[1])) self.label_two.grid(column=0, row=1, sticky='w') else: self.label_two = Label(self._frame_info, text="Number of ants alive: " + str(number_of_ant[1])) self.label_two.grid(column=0, row=1, sticky='w') if number_of_ant[0] == 0 or number_of_ant[0] == 1: self.label_three = Label(self._frame_info, text="Number of ant dead: " + str(number_of_ant[0])) self.label_three.grid(column=0, row=2, sticky='w') else: self.label_three = Label(self._frame_info, text="Number of ants dead: " + str(number_of_ant[0])) self.label_three.grid(column=0, row=2, sticky='w') self._win_ant.mainloop() def steps(self): x = self.scale_dimension.get() self._game.play(x) self.actu() def bsteps(self): x = self.scale_dimension.get() self._game.bplay(x) self.actu() def actu(self): self._board_real, self.coordonate_of_ants, self._steps = self._game.returnn( ) for i in range(len(self._board_real)): for j in range(len(self._board_real[0])): k = self._board_real[i][j] self._monCanvas.itemconfig(self._board[i][j], fill=k) for i in range(len(self.coordonate_of_ants)): if self.coordonate_of_ants[i][0] == [-1, -1]: continue self._monCanvas.itemconfig( self._board[self.coordonate_of_ants[i][0][0]][ self.coordonate_of_ants[i][0][1]], fill='grey') if self.coordonate_of_ants[0][1]: messagebox.showinfo( "Info", "An ant want to go out, that's why the simulation cannot go either further or go back any further" ) if self._steps == 0 or self._steps == 1: self._win_ant.title( f"Langton's ant simulation {self.indice} step {self._steps}") else: self._win_ant.title( f"Langton's ant simulation {self.indice} steps {self._steps}") self.actu_info() def mouseClick(self, event): tempo_x = -1 tempo_y = -1 for x in range(self.col): if (x * self._px) < event.x <= (x * self._px + self._px): tempo_y = x break for y in range(self.col): if (y * self._px) < event.y <= (y * self._px + self._px): tempo_x = y break if tempo_y != -1 and tempo_x != -1: self._game.create_new_ant(tempo_x, tempo_y) self._board_real, self.coordonate_of_ants, self._steps = self._game.returnn( ) for i in range(len(self._board_real)): for j in range(len(self._board_real[0])): k = self._board_real[i][j] self._monCanvas.itemconfig(self._board[i][j], fill=k) for i in range(len(self.coordonate_of_ants)): self._monCanvas.itemconfig( self._board[self.coordonate_of_ants[i][0][0]][ self.coordonate_of_ants[i][0][1]], fill='grey') self.actu_info() def clear(self): self._game.clear() self._board_real, self.coordonate_of_ants, self._steps = self._game.returnn( ) for i in range(len(self._board_real)): for j in range(len(self._board_real[0])): k = self._board_real[i][j] self._monCanvas.itemconfig(self._board[i][j], fill=k) for i in range(len(self.coordonate_of_ants)): self._monCanvas.itemconfig( self._board[self.coordonate_of_ants[i][0][0]][ self.coordonate_of_ants[i][0][1]], fill='grey') self.actu_info() def actu_info(self): self._win_ant.title( f"Langton's ant simulation {self.indice} steps {self._steps}") number_of_ant, number_of_cell = self._game.info() if number_of_cell == 0 or number_of_cell == 1: self.label_one.config(text="Number of cell: " + str(number_of_cell)) else: self.label_one.config(text="Number of cells: " + str(number_of_cell)) if number_of_ant[1] == 0 or number_of_ant[1] == 1: self.label_two.config(text="Number of ant alive: " + str(number_of_ant[1])) else: self.label_two.config(text="Number of ants alive: " + str(number_of_ant[1])) if number_of_ant[0] == 0 or number_of_ant[0] == 1: self.label_three.config(text="Number of ant dead: " + str(number_of_ant[0])) else: self.label_three.config(text="Number of ants dead: " + str(number_of_ant[0]))
"""entry for string with layout""" from tkinter import Tk, StringVar from tkinter.ttk import Entry, Style, Label, Labelframe root = Tk() style = Style() style.theme_use('default') LF_TEXT = 'Beer Type' lf0 = Labelframe(root, text=LF_TEXT) lf0.grid(column=0, row=0) def end_input(evt): """limit on string Parameters ---------- evt : str bind handle Returns ------- None """ print('evt', entsv.get()) if len(entsv.get()) > 5: mess_lbl['text'] = "That's OK" else: mess_lbl['text'] = "Should be at least 6 characters long"
class StringEntry: """String class for entry added colour, change state Parameters ---------- parent : str parent handle lf_text : str text on LabelFrame mess_text : str message def_text : str default text colour : str frame colour mod : str enable or disable state switch Returns ------- string """ def __init__(self, parent, lf_text, mess_text, def_text="", colour='brown', mod=False): self.parent = parent self.lf_text = lf_text self.mess_text = mess_text self.mod = mod self.out_var = StringVar() self.out_var.set(def_text) self.farbe = farbe = { 'blue': 'light blue', 'brown': '#EDEF77', 'green': 'light green', 'pink': '#EAAFBF' } colour = colour if colour in farbe else 'brown' self.colour = colour st1 = Style() st1.theme_use('default') st1.configure(colour + '.TLabelframe', background='#C9B99B') st1.configure(colour + '.TLabelframe.Label', background=farbe[colour]) st1.configure(colour + '.TCheckbutton', background=farbe[colour]) st1.configure('brown.TLabel', background='#EDEF77') self.construct() def construct(self): """construct of LabelFrame and message Parameters ---------- None Returns ------- None """ self.lf1 = Labelframe(self.parent, text=self.lf_text, style=self.colour + '.TLabelframe') self.lf1.grid(column=0, row=0, padx=10, pady=10) self.messlbl = Label(self.lf1, text=self.mess_text, style='brown.TLabel') self.messlbl.grid(row=2, column=0, pady=10, padx=10) self.make_entry() def make_entry(self): """construct of Entry Parameters ---------- None Returns ------- None """ vcmd = self.lf1.register(self.is_okay) self.ent1 = ent1 = Entry(self.lf1, validate='key', validatecommand=(vcmd, '%P', '%S', '%i'), textvariable=self.out_var) ent1.bind("<Return>", self.end_input) ent1.grid(row=1, column=0, padx=10) ent1.focus() if self.mod in (True, False): self.modify() def modify(self): """construct of state switch Parameters ---------- None Returns ------- None """ lf_text = self.lf_text # entry disabled until checkbox is ticked self.cb_opt = Checkbutton(self.lf1, command=self.toggle_opt, style=self.colour + '.TCheckbutton') self.lf1['labelwidget'] = self.cb_opt if self.mod: self.ent1.state(['!disabled']) self.cb_opt.state(['!selected']) self.cb_opt['text'] = lf_text + ' Check to prevent editing ' self.ent1.focus() else: self.ent1.state(['disabled']) self.cb_opt.state(['selected']) self.cb_opt['text'] = lf_text + ' Check to modify ' def toggle_opt(self): """state switch logic Parameters ---------- None Returns ------- None """ lf_text = self.lf_text # state of entry controlled # by the state of the check button in Option frame label widget if self.cb_opt.instate(['selected']): print('selected state') self.ent1.state(['disabled']) self.cb_opt['text'] = lf_text + ' Check to modify ' else: print('unselected state') self.ent1.state(['!disabled']) # enable option self.cb_opt['text'] = lf_text + ' Check to prevent editing ' self.ent1.focus() def end_input(self, _evt): """limit on string Parameters ---------- evt : str bind handle Returns ------- None """ if len(self.out_var.get()) > 5: self.messlbl['text'] = "That's OK" else: self.messlbl['text'] = "Should be at least 6 characters long" def is_okay(self, text, inp, ind): """ validation function Parameters ---------- text : str text if allowed inp : str current input Returns ------- boolean """ ind = int(ind) print(ind) if (inp.isalnum() or inp in (",", ".", "'", " ")) and ind > 0: return True else: return bool((text.isupper() or text == "") and ind == 0)
def entry_float(parent, lf_text, l_limit, u_limit, mess_text, out_var): """Float layout for entry Parameters ---------- parent : str parent handle lf_text : str text on LabelFrame l_limit : float lower limit u_limit : float upper limit mess_text : str message out_var : float tkvar handle Returns ------- float """ st1 = Style() st1.theme_use('default') st1.configure('brown.TLabelframe', background='#C9B99B') st1.configure('brown.TLabelframe.Label', background='#EDEF77') st1.configure('brown.TLabel', background='#EDEF77') st1.configure('lowr.TLabel', background='lightblue') st1.configure('upr.TLabel', background='red') lf0 = Labelframe(parent, text=lf_text, style='brown.TLabelframe') lf0.grid(row=0, column=0, padx=10, pady=10) ulab = Label(lf0, text=str(u_limit) + " upper limit", style='brown.TLabel') ulab.grid(row=0, column=1, padx=10) llab = Label(lf0, text=str(l_limit) + " lower limit", style='brown.TLabel') llab.grid(row=2, column=1, padx=10) def end_input(_evt): """limit on float Parameters ---------- evt : str bind handle Returns ------- None """ ulab['style'] = 'brown.TLabel' llab['style'] = 'brown.TLabel' if l_limit < entsv.get() < u_limit: messlbl['text'] = "That's OK" out_var.set(entsv.get()) elif l_limit >= entsv.get(): messlbl['text'] = "Input below lower limit" llab['style'] = 'lowr.TLabel' else: messlbl['text'] = "Input above upper limit" ulab['style'] = 'upr.TLabel' def is_okay(text): """ validation function Parameters ---------- text : str text if allowed Returns ------- boolean """ if text in ("", "-", ".", "-."): return True try: float(text) except ValueError: return False return True vcmd = lf0.register(is_okay) entsv = DoubleVar() ent0 = Entry(lf0, validate='key', validatecommand=(vcmd, '%P'), textvariable=entsv) ent0.bind("<Return>", end_input) ent0.grid(row=1, column=0, padx=10) ent0.focus() messlbl = Label(lf0, text=mess_text, style='brown.TLabel') messlbl.grid(row=2, column=0, pady=10, padx=10)
class StringEntry: """String class for entry 06layout_string converted to a class Parameters ---------- parent : str parent handle lf_text : str text on LabelFrame mess_text : str message outVar : float tkvar handle Returns ------- string """ def __init__(self, parent, lf_text, mess_text): self.parent = parent self.lf_text = lf_text self.mess_text = mess_text self.out_var = StringVar() st1 = Style() st1.theme_use('default') st1.configure('brown.TLabelframe', background='#C9B99B') st1.configure('brown.TLabelframe.Label', background='#EDEF77') st1.configure('brown.TLabel', background='#EDEF77') self.construct() def construct(self): """construct of LabelFrame and message Parameters ---------- None Returns ------- None """ self.lf0 = Labelframe(self.parent, text=self.lf_text, style='brown.TLabelframe') self.lf0.grid(column=0, row=0, padx=10, pady=10) self.mee_lbl = Label(self.lf0, text=self.mess_text, style='brown.TLabel') self.mee_lbl.grid(row=2, column=0, pady=10, padx=10) self.make_entry() def make_entry(self): """construct of Entry Parameters ---------- None Returns ------- None """ vcmd = self.lf0.register(self.is_okay) ent0 = Entry(self.lf0, validatecommand=(vcmd, '%P', '%S', '%i'), validate='key', textvariable=self.out_var) ent0.bind("<Return>", self.end_input) ent0.grid(row=1, column=0, padx=10) ent0.focus() def end_input(self, _evt): """limit on string Parameters ---------- evt : str bind handle Returns ------- None """ if len(self.out_var.get()) > 5: self.mee_lbl['text'] = "That's OK" else: self.mee_lbl['text'] = "Should be at least 6 characters long" def is_okay(self, text, input, index): """ validation function Parameters ---------- text : str text if allowed input : str current input Returns ------- boolean """ #print(text) index = int(index) print(index) if (input.isalnum() or input in (",", ".", "'", " ")) and index > 0: return True else: return bool((text.isupper() or text == "") and index == 0)
class TabFiles(Frame): def __init__(self, parent, txt: dict = dict(), path_browser=None, path_var: str = ""): """Instanciating the output workbook.""" self.p = parent self.txt = txt Frame.__init__(self) # -- VARIABLES ------------------------------------------------------- self.target_path = StringVar() # formats / type: vectors self.li_vectors_formats = ( ".shp", ".tab", ".kml", ".gml", ".geojson", ) # vectors handled self.li_shp = [] # list for shapefiles path self.li_tab = [] # list for MapInfo tables path self.li_kml = [] # list for KML path self.li_gml = [] # list for GML path self.li_geoj = [] # list for GeoJSON paths self.li_gxt = [] # list for GXT paths self.li_vectors = [] # list for all vectors # formats / type: rasters self.li_raster = [] # list for rasters paths self.li_raster_formats = (".ecw", ".tif", ".jp2") # raster handled # formats / type: file databases self.li_fdb = [] # list for all files databases self.li_egdb = [] # list for Esri File Geodatabases self.li_spadb = [] # list for Spatialite Geodatabases # formats / type: CAO/DAO self.li_cdao = [] # list for all CAO/DAO files self.li_dxf = [] # list for AutoCAD DXF paths self.li_dwg = [] # list for AutoCAD DWG paths self.li_dgn = [] # list for MicroStation DGN paths # formats / type: maps documents self.li_mapdocs = [] # list for all map & documents self.li_qgs = [] # list for QGS path # -- Source path ----------------------------------------------------- self.FrPath = Labelframe(self, name="files", text=txt.get("gui_fr1", "Path")) # target folder self.lb_target = Label(self.FrPath, text=txt.get("gui_path")) self.ent_target = Entry(master=self.FrPath, width=35, textvariable=self.target_path) self.btn_browse = Button( self.FrPath, text="\U0001F3AF " + txt.get("gui_choix", "Browse"), command=lambda: self.get_target_path(r"."), takefocus=True, ) self.btn_browse.focus_force() # widgets placement self.lb_target.grid(row=1, column=1, columnspan=1, sticky="NSWE", padx=2, pady=2) self.ent_target.grid(row=1, column=2, columnspan=1, sticky="NSWE", padx=2, pady=2) self.btn_browse.grid(row=1, column=3, sticky="NSE", padx=2, pady=2) # -- Format filters -------------------------------------------------- self.FrFilters = Labelframe(self, name="filters", text=txt.get("gui_fr3", "Filters")) # formats options self.opt_shp = IntVar(self.FrFilters) # able/disable shapefiles self.opt_tab = IntVar(self.FrFilters) # able/disable MapInfo tables self.opt_kml = IntVar(self.FrFilters) # able/disable KML self.opt_gml = IntVar(self.FrFilters) # able/disable GML self.opt_geoj = IntVar(self.FrFilters) # able/disable GeoJSON self.opt_gxt = IntVar(self.FrFilters) # able/disable GXT self.opt_egdb = IntVar(self.FrFilters) # able/disable Esri FileGDB self.opt_spadb = IntVar(self.FrFilters) # able/disable Spatalite DB self.opt_rast = IntVar(self.FrFilters) # able/disable rasters self.opt_cdao = IntVar(self.FrFilters) # able/disable CAO/DAO files self.opt_qgs = IntVar(self.FrFilters) # able/disable Geospatial QGS # format choosen: check buttons caz_shp = Checkbutton(self.FrFilters, text=".shp", variable=self.opt_shp) caz_tab = Checkbutton(self.FrFilters, text=".tab", variable=self.opt_tab) caz_kml = Checkbutton(self.FrFilters, text=".kml", variable=self.opt_kml) caz_gml = Checkbutton(self.FrFilters, text=".gml", variable=self.opt_gml) caz_geoj = Checkbutton(self.FrFilters, text=".geojson", variable=self.opt_geoj) caz_gxt = Checkbutton(self.FrFilters, text=".gxt", variable=self.opt_gxt) caz_egdb = Checkbutton(self.FrFilters, text="Esri FileGDB", variable=self.opt_egdb) caz_spadb = Checkbutton(self.FrFilters, text="Spatialite", variable=self.opt_spadb) caz_rast = Checkbutton( self.FrFilters, text="rasters ({0})".format(", ".join(self.li_raster_formats)), variable=self.opt_rast, ) caz_cdao = Checkbutton(self.FrFilters, text="CAO/DAO", variable=self.opt_cdao) # widgets placement caz_shp.grid(row=1, column=0, sticky="NSWE", padx=2, pady=2) caz_tab.grid(row=1, column=1, sticky="NSWE", padx=2, pady=2) caz_kml.grid(row=1, column=2, sticky="NSWE", padx=2, pady=2) caz_gml.grid(row=1, column=3, sticky="NSWE", padx=2, pady=2) caz_geoj.grid(row=1, column=4, sticky="NSWE", padx=2, pady=2) caz_gxt.grid(row=1, column=5, sticky="NSWE", padx=2, pady=2) caz_rast.grid(row=2, column=0, columnspan=2, sticky="NSWE", padx=2, pady=2) caz_egdb.grid(row=2, column=2, columnspan=2, sticky="NSWE", padx=2, pady=2) caz_cdao.grid(row=2, column=4, columnspan=1, sticky="NSWE", padx=2, pady=2) caz_spadb.grid(row=2, column=5, columnspan=2, sticky="NSWE", padx=2, pady=2) # frames placement self.FrPath.grid(row=3, column=1, padx=2, pady=2, sticky="NSWE") self.FrFilters.grid(row=4, column=1, padx=2, pady=2, sticky="NSWE") def get_target_path(self, def_rep) -> str: """Browse and insert the path of target folder.""" foldername = askdirectory( parent=self.p, initialdir=def_rep, mustexist=True, title=_("Pick DicoGIS start folder"), ) # check if a folder has been choosen if foldername: try: self.ent_target.delete(0, END) self.ent_target.insert(0, foldername) except Exception as e: logger.info(e) showinfo(title=self.txt.get("nofolder"), message=self.txt.get("nofolder")) return else: pass # set the default output file self.p.master.ent_outxl_filename.delete(0, END) self.p.master.ent_outxl_filename.insert( 0, "DicoGIS_{0}_{1}.xlsx".format( path.split(self.target_path.get())[1], today), ) # count geofiles in a separated thread proc = threading.Thread(target=self.p.master.ligeofiles, args=(foldername, )) proc.daemon = True proc.start() # end of function return foldername
class TabSGBD(Frame): def __init__(self, parent, txt=dict()): """Instanciating the output workbook.""" self.parent = parent Frame.__init__(self) # subframe self.FrDb = Labelframe(self, name="database", text=txt.get("gui_fr2", "SGBD")) # DB variables self.opt_pgvw = IntVar(self.FrDb) # able/disable PostGIS views self.host = StringVar(self.FrDb, "localhost") self.port = IntVar(self.FrDb, 5432) self.dbnb = StringVar(self.FrDb) self.user = StringVar(self.FrDb, "postgres") self.pswd = StringVar(self.FrDb) # Form widgets self.ent_H = Entry(self.FrDb, textvariable=self.host) self.ent_P = Entry(self.FrDb, textvariable=self.port, width=5) self.ent_D = Entry(self.FrDb, textvariable=self.dbnb) self.ent_U = Entry(self.FrDb, textvariable=self.user) self.ent_M = Entry(self.FrDb, textvariable=self.pswd, show="*") caz_pgvw = Checkbutton( self.FrDb, text=txt.get("gui_views", "Views enabled"), variable=self.opt_pgvw, ) # Label widgets self.lb_H = Label(self.FrDb, text=txt.get("gui_host", "Host")) self.lb_P = Label(self.FrDb, text=txt.get("gui_port", "Port")) self.lb_D = Label(self.FrDb, text=txt.get("gui_db", "Database")) self.lb_U = Label(self.FrDb, text=txt.get("gui_user", "User")) self.lb_M = Label(self.FrDb, text=txt.get("gui_mdp", "Password")) # widgets placement self.ent_H.grid(row=1, column=1, columnspan=2, sticky="NSEW", padx=2, pady=2) self.ent_P.grid(row=1, column=3, columnspan=1, sticky="NSE", padx=2, pady=2) self.ent_D.grid(row=2, column=1, columnspan=1, sticky="NSEW", padx=2, pady=2) self.ent_U.grid(row=2, column=3, columnspan=1, sticky="NSEW", padx=2, pady=2) self.ent_M.grid(row=3, column=1, columnspan=3, sticky="NSEW", padx=2, pady=2) self.lb_H.grid(row=1, column=0, sticky="NSEW", padx=2, pady=2) self.lb_P.grid(row=1, column=3, sticky="NSW", padx=2, pady=2) self.lb_D.grid(row=2, column=0, sticky="NSW", padx=2, pady=2) self.lb_U.grid(row=2, column=2, sticky="NSW", padx=2, pady=2) self.lb_M.grid(row=3, column=0, sticky="NSWE", padx=2, pady=2) caz_pgvw.grid(row=4, column=0, sticky="NSWE", padx=2, pady=2) # frame position self.FrDb.grid(row=3, column=1, sticky="NSWE", padx=2, pady=2)
class GUI(object): '''Stellt die Oberflaeche dar. Alle steuerden Taetigkeiten werden (sollten) vom Controller Objekt uebernommen werden. ''' def __init__(self): ''' Constructor ''' self.root = Tk() self.root.title("DinnerLog") self.root.minsize(800, 600) self.root.grid_columnconfigure(0, weight=1) self.root.grid_rowconfigure(0, weight=1) self.root.grid_rowconfigure(1, weight=3) # Ein Frame für alles, das mit Zutaten zu tun hat self.fr_zutaten = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Zutaten") self.fr_zutaten.grid_columnconfigure(0, weight=1) self.fr_zutaten.grid_rowconfigure(0, weight=1) self.fr_zutaten.grid(row=0, column=0, sticky="NSWE") self.lb_zutaten = Listbox(self.fr_zutaten) sb_zutaten = Scrollbar(self.lb_zutaten, orient=VERTICAL) self.lb_zutaten.configure(yscrollcommand=sb_zutaten.set) sb_zutaten.config(command=self.lb_zutaten.yview) sb_zutaten.pack(side="right", fill="both") self.lb_zutaten.grid(row=0, column=0, sticky="NSEW") self._addNeueZutatFrame() # Ein Frame in den alles, das mit Mahlzeiten zu tun hat, kommt self.fr_mahlzeit = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Mahlzeiten") self.fr_mahlzeit.grid_columnconfigure(0, weight=1) self.fr_mahlzeit.grid_rowconfigure(0, weight=1) self.fr_mahlzeit.grid(row=1, column=0, sticky="NSWE") self._addNeueMahlzeitFrame() self.lb_mahlzeiten = Listbox(self.fr_mahlzeit, selectmode=SINGLE) sb_mahlzeiten = Scrollbar(self.lb_mahlzeiten, orient=VERTICAL) sb_mahlzeiten.configure(command=self.lb_mahlzeiten.yview) self.lb_mahlzeiten.configure(yscrollcommand=sb_mahlzeiten.set) sb_mahlzeiten.pack(side="right", fill="both") self.lb_mahlzeiten.grid(row=0, column=0, sticky="NSEW") fr_neu_ok = Frame(self.fr_mahlzeit) fr_neu_ok.grid(row=1, column=0, columnspan=2, sticky="E") self.btn_neu = Button(fr_neu_ok, text="Neu") self.btn_neu.pack(side="left") self.btn_mahlzeit_als_zt = Button(fr_neu_ok, text="Als Zutat") self.btn_mahlzeit_als_zt.pack(anchor=E, side="right") self.btn_insert = Button(fr_neu_ok, text="Hinzufuegen") self.btn_insert.pack(anchor=E, side="right") self.btn_update = Button(fr_neu_ok, text="Update") self.btn_update.pack(anchor=E, side="right") self.btn_delete = Button(fr_neu_ok, text="Loeschen") self.btn_delete.pack(anchor=E, side="right") # Ein Frame der Statistiken darstellt self.fr_stats = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Statistik") self.fr_stats.grid(row=3, column=0, sticky="NSWE") #self.cv_stats = Canvas(self.fr_stats, height=80, width=600) #self.cv_stats.create_line(2,5,598,5, fill="#bbb") def _addNeueMahlzeitFrame(self): self.fr_neue_mz = Frame(self.fr_mahlzeit) self.fr_neue_mz.grid_rowconfigure(2, weight=1) self.fr_neue_mz.grid(row=0, column=1, sticky="WSNE") lbl_name = Label(self.fr_neue_mz, text="Name:") lbl_name.grid(row=0, column=0, sticky="NW") self.en_name = Entry(self.fr_neue_mz) self.en_name.grid(row=0, column=1, columnspan=2, sticky="WNE") lbl_zutat = Label(self.fr_neue_mz, text="Zutaten:") lbl_zutat.grid(row=1, column=0, sticky="NW") self.lb_zutat = Listbox(self.fr_neue_mz) sb_zutat = Scrollbar(self.lb_zutat, orient=VERTICAL) self.lb_zutat.configure(yscrollcommand=sb_zutat.set) sb_zutat.configure(command=self.lb_zutat.yview) sb_zutat.pack(side="right", fill="both") self.lb_zutat.grid(row=2, column=0, columnspan=3, sticky="NWSE") self.var_zutat = StringVar(self.fr_neue_mz) self.opt_zutat = OptionMenu(self.fr_neue_mz, self.var_zutat, "Auswahl") self.opt_zutat.grid(row=3, column=0) self.en_menge = Entry(self.fr_neue_mz) self.en_menge.grid(row=3, column=1) self.btn_mahlzeit_hinzu = Button(self.fr_neue_mz, text="Hinzu") self.btn_mahlzeit_hinzu.grid(row=3, column=2, sticky="E") def _addNeueZutatFrame(self): fr_neue_zt = Frame(self.fr_zutaten) fr_neue_zt.grid(row=0, column=2, sticky="NWSE") lbl_name = Label(fr_neue_zt, text="Name:") lbl_name.grid(row=0, column=0, sticky="W") self.en_name_zt = Entry(fr_neue_zt) self.en_name_zt.grid(row=0, column=1, columnspan=2, sticky="WE") lbl_fett = Label(fr_neue_zt, text="Fett:") lbl_fett.grid(row=1, column=0, sticky="W") self.en_fett = Entry(fr_neue_zt) self.en_fett.grid(row=1, column=1, columnspan=2) lbl_eiweiss = Label(fr_neue_zt, text="Eiweiss:") lbl_eiweiss.grid(row=2, column=0, sticky="W") self.en_eiweiss = Entry(fr_neue_zt) self.en_eiweiss.grid(row=2, column=1, columnspan=2) lbl_kh = Label(fr_neue_zt, text="Kohlenhy.:") lbl_kh.grid(row=3, column=0, sticky="W") self.en_kh = Entry(fr_neue_zt) self.en_kh.grid(row=3, column=1, columnspan=2) self.btn_zutat_insert = Button(fr_neue_zt, text="Hinzu") self.btn_zutat_insert.grid(row=4, column=1, sticky="E") self.btn_zutat_update = Button(fr_neue_zt, text="Update") self.btn_zutat_update.grid(row=5, column=1, sticky="E") self.btn_zutat_delete = Button(fr_neue_zt, text="Loeschen") self.btn_zutat_delete.grid(row=6, column=1, sticky="E")
class GUI(object): '''Stellt die Oberflaeche dar. Alle steuerden Taetigkeiten werden (sollten) vom Controller Objekt uebernommen werden. ''' def __init__(self): ''' Constructor ''' self.root = Tk() self.root.title("DinnerLog") self.root.minsize(800, 600) self.root.grid_columnconfigure(0, weight=1) self.root.grid_rowconfigure(0, weight=1) self.root.grid_rowconfigure(1, weight=3) # Ein Frame für alles, das mit Zutaten zu tun hat self.fr_zutaten = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Zutaten") self.fr_zutaten.grid_columnconfigure(0, weight=1) self.fr_zutaten.grid_rowconfigure(0, weight=1) self.fr_zutaten.grid(row=0, column=0, sticky="NSWE") self.lb_zutaten = Listbox(self.fr_zutaten) sb_zutaten = Scrollbar(self.lb_zutaten, orient=VERTICAL) self.lb_zutaten.configure(yscrollcommand=sb_zutaten.set) sb_zutaten.config(command=self.lb_zutaten.yview) sb_zutaten.pack(side="right", fill="both") self.lb_zutaten.grid(row=0, column=0, sticky="NSEW") self._addNeueZutatFrame() # Ein Frame in den alles, das mit Mahlzeiten zu tun hat, kommt self.fr_mahlzeit = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Mahlzeiten") self.fr_mahlzeit.grid_columnconfigure(0, weight=1) self.fr_mahlzeit.grid_rowconfigure(0, weight=1) self.fr_mahlzeit.grid(row=1, column=0, sticky="NSWE") self._addNeueMahlzeitFrame() self.lb_mahlzeiten = Listbox(self.fr_mahlzeit, selectmode=SINGLE) sb_mahlzeiten = Scrollbar(self.lb_mahlzeiten, orient=VERTICAL) sb_mahlzeiten.configure(command=self.lb_mahlzeiten.yview) self.lb_mahlzeiten.configure(yscrollcommand=sb_mahlzeiten.set) sb_mahlzeiten.pack(side="right", fill="both") self.lb_mahlzeiten.grid(row=0, column=0, sticky="NSEW") fr_neu_ok = Frame(self.fr_mahlzeit) fr_neu_ok.grid(row=1, column=0, columnspan=2, sticky="E") self.btn_neu = Button(fr_neu_ok, text="Neu") self.btn_neu.pack(side="left") self.btn_mahlzeit_als_zt = Button(fr_neu_ok, text="Als Zutat") self.btn_mahlzeit_als_zt.pack(anchor=E, side="right") self.btn_insert = Button(fr_neu_ok, text="Hinzufuegen") self.btn_insert.pack(anchor=E, side="right") self.btn_update = Button(fr_neu_ok, text="Update") self.btn_update.pack(anchor=E, side="right") self.btn_delete = Button(fr_neu_ok, text="Loeschen") self.btn_delete.pack(anchor=E, side="right") # Ein Frame der Statistiken darstellt self.fr_stats = Labelframe(self.root, borderwidth=2, relief=GROOVE, text="Statistik") self.fr_stats.grid(row=3, column=0, sticky="NSWE") #self.cv_stats = Canvas(self.fr_stats, height=80, width=600) #self.cv_stats.create_line(2,5,598,5, fill="#bbb") def _addNeueMahlzeitFrame(self): self.fr_neue_mz = Frame(self.fr_mahlzeit) self.fr_neue_mz.grid_rowconfigure(2, weight=1) self.fr_neue_mz.grid(row=0, column=1, sticky="WSNE") lbl_name = Label(self.fr_neue_mz, text="Name:") lbl_name.grid(row=0, column=0, sticky="NW") self.en_name = Entry(self.fr_neue_mz) self.en_name.grid(row=0, column=1, columnspan=2, sticky="WNE") lbl_zutat = Label(self.fr_neue_mz, text="Zutaten:") lbl_zutat.grid(row=1, column=0, sticky="NW") self.lb_zutat = Listbox(self.fr_neue_mz) sb_zutat = Scrollbar(self.lb_zutat, orient=VERTICAL) self.lb_zutat.configure(yscrollcommand=sb_zutat.set) sb_zutat.configure(command=self.lb_zutat.yview) sb_zutat.pack(side="right", fill="both") self.lb_zutat.grid(row=2, column=0, columnspan=3, sticky="NWSE") self.var_zutat = StringVar(self.fr_neue_mz) self.opt_zutat = OptionMenu(self.fr_neue_mz, self.var_zutat, "Auswahl") self.opt_zutat.grid(row=3, column=0) self.en_menge = Entry(self.fr_neue_mz) self.en_menge.grid(row=3, column=1) self.btn_mahlzeit_hinzu = Button(self.fr_neue_mz, text="Hinzu") self.btn_mahlzeit_hinzu.grid(row=3, column=2, sticky="E") def _addNeueZutatFrame(self): fr_neue_zt = Frame(self.fr_zutaten) fr_neue_zt.grid(row=0, column=2,sticky="NWSE") lbl_name = Label(fr_neue_zt, text="Name:") lbl_name.grid(row=0, column=0, sticky="W") self.en_name_zt = Entry(fr_neue_zt) self.en_name_zt.grid(row=0, column=1, columnspan=2, sticky="WE") lbl_fett = Label(fr_neue_zt, text="Fett:") lbl_fett.grid(row=1, column=0, sticky="W") self.en_fett = Entry(fr_neue_zt) self.en_fett.grid(row=1, column=1, columnspan=2) lbl_eiweiss = Label(fr_neue_zt, text="Eiweiss:") lbl_eiweiss.grid(row=2, column=0, sticky="W") self.en_eiweiss = Entry(fr_neue_zt) self.en_eiweiss.grid(row=2, column=1, columnspan=2) lbl_kh = Label(fr_neue_zt, text="Kohlenhy.:") lbl_kh.grid(row=3, column=0, sticky="W") self.en_kh = Entry(fr_neue_zt) self.en_kh.grid(row=3, column=1, columnspan=2) self.btn_zutat_insert = Button(fr_neue_zt, text="Hinzu") self.btn_zutat_insert.grid(row=4, column=1, sticky="E") self.btn_zutat_update = Button(fr_neue_zt, text="Update") self.btn_zutat_update.grid(row=5, column=1, sticky="E") self.btn_zutat_delete = Button(fr_neue_zt, text="Loeschen") self.btn_zutat_delete.grid(row=6, column=1, sticky="E")
def entry_string(parent, lf_text, mess_text, out_var): """String layout for entry 06layout_string converted to a function Parameters ---------- parent : str parent handle lf_text : str text on LabelFrame mess_text : str message out_var : float tkvar handle Returns ------- string """ st1 = Style() st1.theme_use('default') st1.configure('brown.TLabelframe', background='#C9B99B') st1.configure('brown.TLabelframe.Label', background='#EDEF77') st1.configure('brown.TLabel', background='#EDEF77') lf0 = Labelframe(parent, text=lf_text, style='brown.TLabelframe') lf0.grid(column=0, row=0, padx=10, pady=10) def end_input(_evt): """limit on string Parameters ---------- evt : str bind handle Returns ------- None """ if len(entsv.get()) > 5: mee_lbl['text'] = "That's OK" out_var.set(entsv.get()) else: mee_lbl['text'] = "Should be at least 6 characters long" def is_okay(text, input, index): """ validation function Parameters ---------- text : str text if allowed input : str current inputut index : str indexex Returns ------- boolean """ index = int(index) print(index) if (input.isalnum() or input in (",", ".", "'", " ")) and index > 0: return True else: return bool((text.isupper() or text == "") and index == 0) vcmd = lf0.register(is_okay) entsv = StringVar() ent0 = Entry(lf0, validate='key', textvariable=entsv, validatecommand=(vcmd, '%P', '%S', '%i')) ent0.bind("<Return>", end_input) ent0.grid(row=1, column=0, padx=10) ent0.focus() mee_lbl = Label(lf0, text=mess_text, style='brown.TLabel') mee_lbl.grid(row=2, column=0, pady=10, padx=10)
def __init__(self): Tk.__init__(self) self.title('Historical data downloader') self.resizable(width=False, height=False) self.db = None #self.iconbitmap(os.path.join('res', 'cartong.png')) ####################### # Project information # ####################### row = 0 project_label_frame = Labelframe(self, text='Project information') project_label_frame.grid(sticky='WE', columnspan=2, padx=5, pady=5, ipadx=5, ipady=5) row += 1 self.project_id = StringVar() Label(project_label_frame, text='Project ID : ').grid(column=0, row=row, sticky=W, padx=10, pady=3) e = Entry(project_label_frame, width=25, textvariable=self.project_id, validate='focusout', validatecommand=self.set_project_data) e.grid(column=1, row=row, sticky=(W, E), padx=10, pady=3) e.bind('<Return>', 'event generate %W <Tab>') row += 1 self.project_name = StringVar() Label(project_label_frame, text='Project name : ').grid(column=0, row=row, sticky=W, padx=10, pady=3) Label(project_label_frame, textvariable=self.project_name).grid(column=1, row=row, sticky=(W, E), padx=10, pady=3) ######################### # File name information # ######################### row += 1 file_name_label_frame = Labelframe(self, text='File name information') file_name_label_frame.grid(sticky='WE', columnspan=100, padx=5, pady=5, ipadx=5, ipady=5) row += 1 self.iso3 = StringVar() Label(file_name_label_frame, text='Code ISO 3 (EX: FRA) : ').grid(column=0, row=row, sticky=W, padx=10, pady=3) Entry(file_name_label_frame, width=7, textvariable=self.iso3).grid(column=1, row=row, sticky=(W, E), padx=10, pady=3) row += 1 self.localisation = StringVar() Label(file_name_label_frame, text='Localisation (EX: city or camp name) : ').grid(column=0, row=row, sticky=W, padx=10, pady=3) Entry(file_name_label_frame, width=30, textvariable=self.localisation).grid(column=1, columnspan=99, row=row, sticky=(W, E), padx=10, pady=3) ################### # Extraction size # ################### row += 1 extraction_size_label_frame = Labelframe(self, text='Extraction size') extraction_size_label_frame.grid(sticky='WE', columnspan=2, padx=5, pady=5, ipadx=5, ipady=5) row += 1 self.extraction_type = StringVar(value='bbox') Radiobutton(extraction_size_label_frame, text='Polygon', variable=self.extraction_type, value='polygon', command=self.hide_percent).grid(column=0, row=row, sticky=W, padx=10, pady=3) Radiobutton(extraction_size_label_frame, text='Bounding Box', variable=self.extraction_type, value='bbox', command=self.show_percent).grid(column=1, row=row, sticky=W, padx=10, pady=3) row += 1 self.percent_increase_bbox = IntVar() self.percent_label = Label(extraction_size_label_frame, text='Surface increasing in % [0 to do not increase] : ') self.percent_label.grid(column=0, row=row, sticky=W, padx=10, pady=3) self.percent_entry = Entry(extraction_size_label_frame, width=7, textvariable=self.percent_increase_bbox) self.percent_entry.grid(column=1, row=row, sticky=(W, E), padx=10, pady=3) ######### # Dates # ######### row += 1 date_label_frame = Labelframe(self, text='Dates') date_label_frame.grid(sticky='WE', columnspan=2, padx=5, pady=5, ipadx=5, ipady=5) row += 1 self.project_start_date = StringVar() Label(date_label_frame, text='Project start date : ').grid(column=0, row=row, sticky=W, padx=10, pady=3) Label(date_label_frame, textvariable=self.project_start_date).grid(column=1, row=row, sticky=(W, E), padx=10, pady=3) row += 1 self.extraction_start_date = StringVar() Label(date_label_frame, text='Extraction start date : ').grid(column=0, row=row, sticky=W, padx=10, pady=3) Entry(date_label_frame, width=7, textvariable=self.extraction_start_date).grid(column=1, row=row, sticky=(W, E), padx=10, pady=3) row += 1 self.project_end_date = StringVar() Label(date_label_frame, text='Project end date : ').grid(column=0, row=row, sticky=W, padx=10, pady=3) Label(date_label_frame, textvariable=self.project_end_date).grid(column=1, row=row, sticky=(W, E), padx=10, pady=3) row += 1 ohsome_end_date = StringVar(value=get_last_available_ohsome_date()) Label(date_label_frame, text='Ohsome latest available date : ').grid(column=0, row=row, sticky=W, padx=10, pady=3) Label(date_label_frame, textvariable=ohsome_end_date).grid(column=1, row=row, sticky=(W, E), padx=10, pady=3) row += 1 self.extraction_end_date = StringVar() Label(date_label_frame, text='Extraction start date : ').grid(column=0, row=row, sticky=W, padx=10, pady=3) Entry(date_label_frame, width=7, textvariable=self.extraction_end_date).grid(column=1, row=row, sticky=(W, E), padx=10, pady=3) row += 1 self.RunDialogButton = Button(self, text='Run', command=self.run) self.RunDialogButton.grid(row=row, columnspan=2, ipadx=20) row += 1 self.LogBox = Text(self, height=10, width=60, state=DISABLED) self.LogBox.grid(row=row, column=0, columnspan=2, padx=10, pady=10)
class MainApp(Tk): def __init__(self): Tk.__init__(self) self.notebook = Notebook(self) self.wm_title("Sensitivity Analysis Tool") self.notebook.grid() self.construct_home_tab() self.simulations = [] self.current_simulation = None self.current_tab = None self.abort = Value('b', False) self.abort_univar_overall = Value('b', False) self.simulation_vars = {} self.attributes("-topmost", True) self.tot_sim_num = 0 self.sims_completed = Value('i',0) self.start_time = None self.univar_plot_counter = 1 self.finished_figures = [] self.univar_row_num=0 self.last_results_plotted = None self.last_update = None def construct_home_tab(self): self.home_tab = Frame(self.notebook) self.notebook.add(self.home_tab, text = 'Home') Button(self.home_tab, text='Upload Excel Data', command=self.open_excel_file).grid(row=0,column=1, sticky = E, pady = 5,padx = 5) self.input_csv_entry = Entry(self.home_tab) self.input_csv_entry.grid(row=0, column=2) Button(self.home_tab, text="Upload Aspen Model", command=self.open_aspen_file).grid(row=1, column = 1,sticky = E, pady = 5,padx = 5) self.aspen_file_entry = Entry(self.home_tab) self.aspen_file_entry.grid(row=1, column=2,pady = 5,padx = 5) Button(self.home_tab, text="Upload Excel Model", command=self.open_solver_file).grid(row=2,column = 1,sticky = E, pady = 5,padx = 5) self.excel_solver_entry = Entry(self.home_tab) self.excel_solver_entry.grid(row=2, column=2,pady = 5,padx = 5) Button(self.home_tab, text="Load Data", command=self.make_new_tab).grid(row=5,column = 3,sticky = E, pady = 5,padx = 5) self.analysis_type = StringVar(self.home_tab) self.analysis_type.set("Choose Analysis Type") OptionMenu(self.home_tab, self.analysis_type,"Single Point Analysis","Univariate Sensitivity", "Multivariate Sensitivity").grid(row = 5,sticky = E,column = 2,padx =5, pady = 5) Label(self.home_tab, text='CPU Core Count :').grid(row=3, column=1, sticky=E) self.num_processes_entry = Entry(self.home_tab) self.num_processes_entry.grid(row=3, column=2, pady=5, padx=5) def make_new_tab(self): if self.current_tab: self.notebook.forget(self.current_tab) self.current_tab = None if self.analysis_type.get() == 'Choose Analysis Type': print("ERROR: Select an Analysis Type") elif self.analysis_type.get() == 'Univariate Sensitivity': self.current_tab = Frame(self.notebook) self.notebook.add(self.current_tab,text = "Univariate Analysis") ##############Tab 2 LABELS################## Label(self.current_tab, text="Save As :").grid(row=4, column= 1, sticky = E,pady = 5,padx = 5) self.save_as_entry= Entry(self.current_tab) self.save_as_entry.grid(row=4, column=2,pady = 5,padx = 5) Label(self.current_tab,text = ".csv").grid(row = 4, column = 3, sticky = W) Label(self.current_tab, text ='').grid(row= 13, column =1) Button(self.current_tab, text='Run Univariate Sensitivity Analysis', command=self.initialize_univar_analysis).grid(row=14, column=3, columnspan=2, pady=4) Button(self.current_tab, text='Display Variable Distributions', command=self.plot_init_dist).grid(row=14, column=1, columnspan=2, sticky = W, pady=4) Button(self.current_tab, text='Fill # Trials', command=self.fill_num_trials).grid(row=7, columnspan = 2, sticky =E, column=1, pady=4) self.fill_num_sims = Entry(self.current_tab) self.fill_num_sims.grid(row=7,column = 3,sticky =W, pady =2, padx = 2) self.fill_num_sims.config(width = 10) self.options_box = Labelframe(self.current_tab, text='Run Options:') self.options_box.grid(row = 15,column = 3, pady = 10,padx = 10) Button(self.options_box, text = "Next Variable", command=self.abort_sim).grid( row=6,columnspan = 1, column = 2, sticky=W) Button(self.options_box, text = "Abort", command=self.abort_univar_overall_fun).grid( row= 6,columnspan = 1, column = 3, sticky=W) elif self.analysis_type.get() == 'Single Point Analysis': self.current_tab = Frame(self.notebook) self.notebook.add(self.current_tab, text = 'Single Point') Label(self.current_tab, text="Save As :").grid(row=0, column= 0, sticky = E,pady = 5,padx = 5) self.save_as_entry = Entry(self.current_tab) self.save_as_entry.grid(row=0, column=1,pady = 5,padx = 5) Button(self.current_tab, text='Calculate MFSP', command=self.initialize_single_point).grid(row=7, column=1, columnspan=2, pady=4) elif self.analysis_type.get() == 'Multivariate Sensitivity': self.current_tab = Frame(self.notebook) self.notebook.add(self.current_tab,text = "Multivariate Analysis") Label(self.current_tab, text="Number of Simulations :").grid(row=3, column= 1, sticky = E,pady = 5,padx = 5) self.num_sim_entry = Entry(self.current_tab) self.num_sim_entry.grid(row=3, column=2,pady = 5,padx = 5) Label(self.current_tab, text="Save As :").grid(row=4, column= 1, sticky = E,pady = 5,padx = 5) self.save_as_entry = Entry(self.current_tab) self.save_as_entry.grid(row=4, column=2,pady = 5,padx = 5) Label(self.current_tab,text = ".csv").grid(row = 4, column = 3, sticky = W) Button(self.current_tab, text='Run Multivariate Analysis', command=self.initialize_multivar_analysis).grid(row=6, column=3, columnspan=2, sticky=W, pady=4) Button(self.current_tab, text='Display Variable Distributions', command=self.plot_init_dist).grid(row=6, column=1, columnspan=2, sticky=W, pady=4) self.load_variables_into_GUI() self.notebook.select(self.current_tab) def load_variables_into_GUI(self): sens_vars = str(self.input_csv_entry.get()) single_pt_vars = [] univariate_vars = [] multivariate_vars = [] type_of_analysis = self.analysis_type.get() with open(sens_vars) as f: reader = DictReader(f)# Skip the header row for row in reader: if row['Toggle'].lower().strip() == 'true': if type_of_analysis =='Single Point Analysis': single_pt_vars.append((row["Variable Name"], float(row["Range of Values"].split(',')[0].strip()))) elif type_of_analysis == 'Multivariate Analysis': multivariate_vars.append(row["Variable Name"]) else: univariate_vars.append(( row["Variable Name"], row["Format of Range"].strip().lower( ), row['Range of Values'].split(','))) #now populate the gui with the appropriate tab and variables stored above if type_of_analysis == 'Single Point Analysis': self.current_tab.config(width = '5c', height = '5c') self.sp_value_entries = {} # Create a frame for the canvas with non-zero row&column weights frame_canvas = Frame(self.current_tab) frame_canvas.grid(row=2, column=1, pady=(5, 0)) frame_canvas.grid_rowconfigure(0, weight=1) frame_canvas.grid_columnconfigure(0, weight=1) frame_canvas.config(height = '5c') # Add a canvas in the canvas frame canvas = Canvas(frame_canvas) canvas.grid(row=0, column=0, sticky="news") canvas.config(height = '5c') # Link a scrollbar to the canvas vsb = Scrollbar(frame_canvas, orient="vertical", command=canvas.yview) vsb.grid(row=0, column=1,sticky = 'ns') canvas.configure(yscrollcommand=vsb.set) # Create a frame to contain the variables frame_vars = Frame(canvas) canvas.create_window((0, 0), window=frame_vars, anchor='nw') frame_vars.config(height = '5c') self.sp_row_num = 0 for name,value in single_pt_vars: self.sp_row_num += 1 key = str(self.sp_row_num) Label(frame_vars, text= name).grid(row=self.sp_row_num, column= 1, sticky = E,pady = 5,padx = 5) key=Entry(frame_vars) key.grid(row=self.sp_row_num, column=2,pady = 5,padx = 5) key.delete(first=0,last=END) key.insert(0,str(value)) self.sp_value_entries[name]= key # Determine the size of the Canvas frame_vars.update_idletasks() frame_canvas.config(width='5c', height='10c') # Set the canvas scrolling region canvas.config(scrollregion=canvas.bbox("all")) if type_of_analysis == 'Univariate Sensitivity': self.univar_ntrials_entries = {} Label(self.current_tab, text= 'Variable Name').grid(row=8, column= 1,pady = 5,padx = 5, sticky= E) Label(self.current_tab, text= 'Sampling Type').grid(row=8, column= 2,pady = 5,padx = 5, sticky=E) Label(self.current_tab, text= '# of Trials').grid(row=8, column= 3,pady = 5,padx = 5) # Create a frame for the canvas with non-zero row&column weights frame_canvas1 = Frame(self.current_tab) frame_canvas1.grid(row=9, column=1, columnspan =3, pady=(5, 0)) frame_canvas1.grid_rowconfigure(0, weight=1) frame_canvas1.grid_columnconfigure(0, weight=1) frame_canvas1.config(height = '3c') # Add a canvas in the canvas frame canvas1 = Canvas(frame_canvas1) canvas1.grid(row=0, column=0, sticky="news") canvas1.config(height = '3c') # Link a scrollbar to the canvas vsb = Scrollbar(frame_canvas1, orient="vertical", command=canvas1.yview) vsb.grid(row=0, column=1,sticky = 'ns') canvas1.configure(yscrollcommand=vsb.set) # Create a frame to contain the variables frame_vars1 = Frame(canvas1) frame_vars1.config(height = '3c') canvas1.create_window((0, 0), window=frame_vars1, anchor='nw') for name, format_of_data, vals in univariate_vars: Label(frame_vars1, text= name).grid(row=self.univar_row_num, column= 1,pady = 5,padx = 5) Label(frame_vars1, text= format_of_data).grid(row=self.univar_row_num, column= 2,pady = 5,padx = 5) if not(format_of_data == 'linspace' or format_of_data == 'list'): key2=Entry(frame_vars1) key2.grid(row=self.univar_row_num, column=3,pady = 5,padx = 5) #key2.insert(0,univariate_sims) self.univar_ntrials_entries[name]= key2 else: if format_of_data == 'linspace': Label(frame_vars1,text= str(vals[2])).grid(row=self.univar_row_num, column= 3,pady = 5,padx = 5) else: Label(frame_vars1,text= str(len(vals))).grid(row=self.univar_row_num, column= 3,pady = 5,padx = 5) self.univar_row_num += 1 # Update vars frames idle tasks to let tkinter calculate variable sizes frame_vars1.update_idletasks() # Determine the size of the Canvas frame_canvas1.config(width='5c', height='5c') # Set the canvas scrolling region canvas1.config(scrollregion=canvas1.bbox("all")) def get_distributions(self): if self.analysis_type.get() == 'Univariate Sensitivity': if self.univar_ntrials_entries: max_num_sim = 0 for slot in self.univar_ntrials_entries.values(): try: cur_num_sim = int(slot.get()) except: cur_num_sim = 1 max_num_sim = max(max_num_sim, cur_num_sim) else: max_num_sim = 1 self.simulation_vars, self.simulation_dist = self.construct_distributions(ntrials=max_num_sim) for (aspen_variable, aspen_call, fortran_index), dist in self.simulation_vars.items(): if aspen_variable in self.univar_ntrials_entries: try: num_trials_per_var = int(self.univar_ntrials_entries[aspen_variable].get()) except: num_trials_per_var = 1 self.simulation_vars[(aspen_variable, aspen_call, fortran_index)] = dist[:num_trials_per_var] self.simulation_dist[aspen_variable] = dist[:num_trials_per_var] else: try: ntrials = int(self.num_sim_entry.get()) except: ntrials=1 self.simulation_vars, self.simulation_dist = self.construct_distributions(ntrials=ntrials) def construct_distributions(self, ntrials=1): ''' Given the excel input from the user in the GUI, produce a list_of_variables the user wants to change as well as their distributions that should be randomly sampled from. ''' gui_excel_input = str(self.input_csv_entry.get()) with open(gui_excel_input) as f: reader = DictReader(f)# Skip the header row simulation_vars = {} simulation_dist = {} for row in reader: if row['Toggle'].lower().strip() == 'true': dist_type = row['Format of Range'].lower() aspen_variable = row['Variable Name'] aspen_call = row['Variable Aspen Call'] bounds = row['Bounds'].split(',') lb = float(bounds[0].strip()) ub = float(bounds[1].strip()) if 'normal' in dist_type or 'gaussian' in dist_type: dist_variables = row['Range of Values'].split(',') distribution = self.sample_gauss(float(dist_variables[0].strip()), float(dist_variables[1].strip()), lb, ub, ntrials) if 'linspace' in dist_type: linspace_vars = row['Range of Values'].split(',') distribution = linspace(float(linspace_vars[0].strip()), float(linspace_vars[1].strip()), float(linspace_vars[2].strip())) if 'poisson' in dist_type: lambda_p = float(row['Range of Values'].strip()) distribution = self.sample_poisson(lambda_p, lb, ub, ntrials) if 'pareto' in dist_type: pareto_vals = row['Range of Values'].split(',') shape = float(pareto_vals[0].strip()) scale = float(pareto_vals[1].strip()) distribution = self.sample_pareto(shape, scale, lb, ub, ntrials) if 'list' in dist_type: lst = row['Range of Values'].split(',') distribution = [] for l in lst: distribution.append(float(l.strip())) if 'uniform' in dist_type: lb_ub = row['Range of Values'].split(',') lb_uniform, ub_uniform = float(lb_ub[0].strip()), float(lb_ub[1].strip()) distribution = self.sample_uniform(lb_uniform, ub_uniform, lb, ub, ntrials) simulation_dist[aspen_variable] = distribution[:] fortran_index = (0,0) if row['Fortran Call'].strip() != "": fortran_call = row['Fortran Call'] value_to_change = row['Fortran Value to Change'].strip() len_val = len(value_to_change) for i in range(len(fortran_call)): if fortran_call[i:i+len_val] == value_to_change: fortran_index = (i, i+len_val) #NOT INCLUSIVE for i, v in enumerate(distribution): distribution[i] = self.make_fortran(fortran_call, fortran_index, v) simulation_vars[(aspen_variable, aspen_call, fortran_index)] = distribution return simulation_vars, simulation_dist def sample_gauss(self,mean, std, lb, ub, ntrials): d = [] for i in range(ntrials): rand_sample = random.normal(mean,std) while(rand_sample < lb or rand_sample > ub): rand_sample = random.normal(mean,std) d.append(rand_sample) return d def sample_uniform(self,lb_uniform, ub_uniform, lb, ub, ntrials): d = [] for i in range(ntrials): rand_sample = random.uniform(lb_uniform, ub_uniform) while(rand_sample < lb or rand_sample > ub): rand_sample = random.uniform(lb_uniform, ub_uniform) d.append(rand_sample) return d def sample_poisson(self,lambda_p, lb, ub, ntrials): d = [] for i in range(ntrials): rand_sample = random.poisson(10000*lambda_p)/10000 while(rand_sample < lb or rand_sample > ub): rand_sample = random.poisson(10000*lambda_p)/10000 d.append(rand_sample) return d def sample_pareto(self, shape, scale, lb, ub, ntrials): d = [] for i in range(ntrials): rand_sample = (random.pareto(shape) + 1) * scale while(rand_sample < lb or rand_sample > ub): rand_sample = (random.pareto(shape) + 1) * scale d.append(rand_sample) return d def make_fortran(self, fortran_call, fortran_index, val): return fortran_call[:fortran_index[0]] + str(val) + fortran_call[fortran_index[1]:] def disp_sp_mfsp(self): try: if self.current_simulation.results: mfsp = self.current_simulation.results[0].at[0, 'MFSP'] if mfsp: Label(self.current_tab, text= 'MFSP = ${:.2f}'.format(mfsp)).grid( row=self.sp_row_num+1, column = 1) else: Label(self.current_tab, text= 'Aspen Failed to Converge').grid( row=self.sp_row_num+1, column = 1) else: self.after(5000, self.disp_sp_mfsp) except: self.after(5000, self.disp_sp_mfsp) def single_point_analysis(self): self.store_user_inputs() self.get_distributions() # update simulation variable values based on user input in GUI for (aspen_variable, aspen_call, fortran_index), values in self.simulation_vars.items(): self.simulation_vars[(aspen_variable, aspen_call, fortran_index)] = [float( self.sp_value_entries[aspen_variable].get())] self.create_simulation_object(self.simulation_vars, self.vars_to_change, self.output_file, self.num_trial) self.run_simulations() def run_multivar_sens(self): Button(self.current_tab, text = "Abort", command=self.abort_sim).grid( row=7,columnspan = 1, column = 3, sticky=W) self.store_user_inputs() if len(self.simulation_vars) == 0: self.get_distributions() self.create_simulation_object(self.simulation_vars, self.vars_to_change, self.output_file, self.num_trial) self.run_simulations() def run_univ_sens(self): self.store_user_inputs() if len(self.simulation_vars) == 0: self.get_distributions() for (aspen_variable, aspen_call, fortran_index), values in self.simulation_vars.items(): self.create_simulation_object({(aspen_variable, aspen_call, fortran_index): values}, [aspen_variable], self.output_file+'_'+aspen_variable, len(values)) self.run_simulations() def store_user_inputs(self): self.aspen_file = str(self.aspen_file_entry.get()) try: self.num_processes = int(self.num_processes_entry.get()) except: self.num_processes = 1 self.excel_solver_file= str(self.excel_solver_entry.get()) try: self.num_trial = int(self.num_sim_entry.get()) except: self.num_trial = 1 self.output_file = str(self.save_as_entry.get()) self.input_csv = str(self.input_csv_entry.get()) self.vars_to_change = [] with open(self.input_csv) as f: reader = DictReader(f)# Skip the header row for row in reader: if row['Toggle'].lower().strip() == 'true': self.vars_to_change.append(row["Variable Name"]) def run_simulations(self): self.start_time = time() for sim in self.simulations: self.current_simulation = sim self.current_simulation.init_sims() if self.abort_univar_overall.value: self.abort.value = True self.univar_plot_counter += 1 def parse_output_vars(self): excels_to_ignore = {} for p in process_iter(): if 'excel' in p.name().lower(): excels_to_ignore[p.pid] = 1 excel, book = open_excelCOMS(self.excel_solver_file) self.output_vars = [] row_counter = 3 while True: var_name = book.Sheets('Output').Evaluate("B" + str(row_counter)).Value if var_name: units = book.Sheets('Output').Evaluate("D" + str(row_counter)).Value column_name = var_name + ' (' + units + ')' if units else var_name self.output_vars.append(column_name) else: break row_counter += 1 self.output_value_cells = "C3:C" + str(row_counter - 1) self.output_vars += ['Aspen Errors'] for p in process_iter(): if 'excel' in p.name().lower() and p.pid not in excels_to_ignore: p.terminate() def create_simulation_object(self, simulation_vars, vars_to_change, output_file, num_trial): self.parse_output_vars() self.output_columns = vars_to_change + self.output_vars new_sim = Simulation(self.sims_completed, num_trial, simulation_vars, output_file, path.dirname(str(self.input_csv_entry.get())), self.aspen_file, self.excel_solver_file, self.abort, vars_to_change, self.output_value_cells, self.output_columns, save_freq=5, num_processes=self.num_processes) self.simulations.append(new_sim) self.tot_sim_num += num_trial def initialize_single_point(self): self.worker_thread = Thread( target=lambda: self.single_point_analysis()) self.worker_thread.start() self.after(5000, self.disp_sp_mfsp) def initialize_univar_analysis(self): self.worker_thread = Thread( target=lambda: self.run_univ_sens()) self.worker_thread.start() self.status_label = None self.time_rem_label = None self.after(5000, self.univar_gui_update) def initialize_multivar_analysis(self): self.worker_thread = Thread( target=lambda: self.run_multivar_sens()) self.worker_thread.start() self.status_label = None self.time_rem_label = None self.multivar_gui_update() def disp_status_update(self): if self.current_simulation and not self.abort.value: if len(self.current_simulation.results) == self.current_simulation.tot_sim: tmp = Label(self.current_tab, text= 'Status: Simulation Complete ') else: tmp = Label(self.current_tab, text= 'Status: Simulation Running | {} Results Collected'.format( len(self.current_simulation.results))) if self.univar_row_num != 0: row = 15 else: row = 8 tmp.grid(row=row, column = 1, sticky=W, columnspan=2) if self.status_label: self.status_label.destroy() self.status_label = tmp def disp_time_remaining(self): if self.start_time and self.sims_completed.value != self.last_update: self.last_update = self.sims_completed.value elapsed_time = time() - self.start_time if self.sims_completed.value > 0: remaining_time = ((elapsed_time / self.sims_completed.value) * (self.tot_sim_num - self.sims_completed.value))//60 hours, minutes = divmod(remaining_time, 60) tmp = Label(self.current_tab, text='Time Remaining: {} Hours, {} Minutes '.format(int(hours), int(minutes))) else: tmp = Label(self.current_tab, text='Time Remaining: N/A') if self.univar_row_num != 0: row = 16 else: row = 9 tmp.grid(row=row, column=1, columnspan=2,sticky=W) if self.time_rem_label: self.time_rem_label.destroy() self.time_rem_label = tmp def plot_on_GUI(self): if not self.current_simulation: return if len(self.current_simulation.results) == self.last_results_plotted: return self.last_results_plotted = len(self.current_simulation.results) if self.current_simulation.results: results = concat(self.current_simulation.results).sort_index() results = results[[d is not None for d in results['MFSP']]] # filter to make sure you aren't plotting None results else: results = DataFrame(columns=self.output_columns) fig_list =[] num_bins = 15 mfsp_fig = Figure(figsize = (3,3), facecolor=[240/255,240/255,237/255], tight_layout=True) b = mfsp_fig.add_subplot(111) b.hist(results['MFSP'], num_bins, facecolor='blue', edgecolor='black', alpha=1.0) b.set_title('MFSP') fig_list.append(mfsp_fig) for var, values in self.simulation_dist.items(): fig = Figure(figsize = (3,3), facecolor=[240/255,240/255,237/255], tight_layout=True) a = fig.add_subplot(111) _, bins, _ = a.hist(self.simulation_dist[var], num_bins, facecolor='white', edgecolor='black',alpha=1.0) a.hist(results[var], bins=bins, facecolor='blue',edgecolor='black', alpha=1.0) a.set_title(var) fig_list.append(fig) if self.univar_row_num != 0: row_num = 17 else: row_num = 10 frame_canvas = Frame(self.current_tab) frame_canvas.grid(row=row_num, column=1, columnspan = 3,pady=(5, 0)) frame_canvas.grid_rowconfigure(0, weight=1) frame_canvas.grid_columnconfigure(0, weight=1) frame_canvas.config(height = '10c', width='16c') main_canvas = Canvas(frame_canvas) main_canvas.grid(row=0, column=0, sticky="news") main_canvas.config(height = '10c', width='16c') vsb = Scrollbar(frame_canvas, orient="vertical", command=main_canvas.yview) vsb.grid(row=0, column=1,sticky = 'ns') main_canvas.configure(yscrollcommand=vsb.set) figure_frame = Frame(main_canvas) main_canvas.create_window((0, 0), window=figure_frame, anchor='nw') figure_frame.config(height = '10c', width='16c') row_num = 0 column = False for figs in fig_list: figure_canvas = FigureCanvasTkAgg(figs, master=figure_frame) if column: col = 4 else: col = 1 #figure_canvas.draw() figure_canvas.get_tk_widget().grid( row=row_num, column=col,columnspan=2, rowspan = 5, pady = 5,padx = 8, sticky=E) #figure_canvas._tkcanvas.grid(row=row_num, column = 0,columnspan = 10, rowspan = 10, sticky= W+E+N+S, pady = 5,padx = 5) if column: row_num += 5 column = not column figure_frame.update_idletasks() frame_canvas.config(width='16c', height='10c') # Set the canvas scrolling region main_canvas.config(scrollregion=figure_frame.bbox("all")) def plot_univ_on_GUI(self): if not self.current_simulation: return if len(self.current_simulation.results) == self.last_results_plotted: return self.last_results_plotted = len(self.current_simulation.results) current_var = self.current_simulation.vars_to_change[0] if self.current_simulation.results: results = concat(self.current_simulation.results).sort_index() results = results[[d is not None for d in results['MFSP']]] # filter to make sure you aren't plotting None results else: results = DataFrame(columns=self.output_columns) fig_list =[] var_fig = Figure(figsize = (3,3), facecolor=[240/255,240/255,237/255], tight_layout=True) a = var_fig.add_subplot(111) num_bins = 15 _, bins, _ = a.hist(self.simulation_dist[current_var], num_bins, facecolor='white',edgecolor='black', alpha=1.0) a.hist(results[current_var], bins=bins, facecolor='blue',edgecolor='black', alpha=1.0) a.set_title(current_var) fig_list.append(var_fig) mfsp_fig = Figure(figsize = (3,3), facecolor=[240/255,240/255,237/255], tight_layout=True) b = mfsp_fig.add_subplot(111) b.hist(results['MFSP'], num_bins, facecolor='blue', edgecolor='black', alpha=1.0) b.set_title('MFSP - ' + current_var) fig_list.append(mfsp_fig) figs_to_plot = self.finished_figures[:] + fig_list if len(self.current_simulation.results) == self.current_simulation.tot_sim: self.finished_figures += fig_list if self.univar_row_num != 0: row_num = 17 else: row_num = 10 frame_canvas = Frame(self.current_tab) frame_canvas.grid(row=row_num, column=1, columnspan = 3,pady=(5, 0)) frame_canvas.grid_rowconfigure(0, weight=1) frame_canvas.grid_columnconfigure(0, weight=1) frame_canvas.config(height = '10c', width='16c') main_canvas = Canvas(frame_canvas) main_canvas.grid(row=0, column=0, sticky="news") main_canvas.config(height = '10c', width='16c') vsb = Scrollbar(frame_canvas, orient="vertical", command=main_canvas.yview) vsb.grid(row=0, column=1,sticky = 'ns') main_canvas.configure(yscrollcommand=vsb.set) figure_frame = Frame(main_canvas) main_canvas.create_window((0, 0), window=figure_frame, anchor='nw') figure_frame.config(height = '10c', width='16c') row_num = 0 column = False for figs in figs_to_plot: figure_canvas = FigureCanvasTkAgg(figs, master=figure_frame) if column: col = 4 else: col = 1 #figure_canvas.draw() figure_canvas.get_tk_widget().grid( row=row_num, column=col,columnspan=2, rowspan = 5, pady = 5,padx = 8, sticky=E) #figure_canvas._tkcanvas.grid(row=row_num, column = 0,columnspan = 10, rowspan = 10, sticky= W+E+N+S, pady = 5,padx = 5) if column: row_num += 5 column = not column figure_frame.update_idletasks() frame_canvas.config(width='16c', height='10c') # Set the canvas scrolling region main_canvas.config(scrollregion=figure_frame.bbox("all")) def plot_init_dist(self): ''' This function will plot the distribution of variable calls prior to running the simulation. This will enable users to see whether the distributions are as they expected. ''' self.get_distributions() fig_list =[] for var, values in self.simulation_dist.items(): fig = Figure(figsize = (3,3), facecolor=[240/255,240/255,237/255], tight_layout=True) a = fig.add_subplot(111) num_bins = 15 a.hist(values, num_bins, facecolor='blue', edgecolor='black', alpha=1.0) a.set_title(var) fig_list.append(fig) if self.univar_row_num != 0: row_num = 17 else: row_num = 10 frame_canvas = Frame(self.current_tab) frame_canvas.grid(row=row_num, column=1, columnspan = 3,pady=(5, 0)) frame_canvas.grid_rowconfigure(0, weight=1) frame_canvas.grid_columnconfigure(0, weight=1) frame_canvas.config(height = '10c', width='16c') main_canvas = Canvas(frame_canvas) main_canvas.grid(row=0, column=0, sticky="news") main_canvas.config(height = '10c', width='16c') vsb = Scrollbar(frame_canvas, orient="vertical", command=main_canvas.yview) vsb.grid(row=0, column=2,sticky = 'ns') main_canvas.configure(yscrollcommand=vsb.set) figure_frame = Frame(main_canvas) main_canvas.create_window((0, 0), window=figure_frame, anchor='nw') figure_frame.config(height = '10c', width='16c') row_num = 0 column = False for figs in fig_list: figure_canvas = FigureCanvasTkAgg(figs, master=figure_frame) if column: col = 4 else: col = 1 figure_canvas.get_tk_widget().grid( row=row_num, column=col,columnspan=2, rowspan = 5, pady = 5,padx = 8, sticky=E) if column: row_num += 5 column = not column figure_frame.update_idletasks() frame_canvas.config(width='16c', height='10c') main_canvas.config(scrollregion=figure_frame.bbox("all")) def univar_gui_update(self): self.disp_status_update() self.disp_time_remaining() self.plot_univ_on_GUI() ####################### ADD AUTO UPDATE GRAPHS ############# self.after(10000, self.univar_gui_update) def multivar_gui_update(self): self.disp_status_update() self.disp_time_remaining() self.plot_on_GUI() ####################### ADD AUTO UPDATE GRAPHS ############# self.after(10000, self.multivar_gui_update) def fill_num_trials(self): ntrials = self.fill_num_sims.get() for name, slot in self.univar_ntrials_entries.items(): slot.delete(0, END) slot.insert(0, ntrials) def open_excel_file(self): filename = askopenfilename(title = "Select file", filetypes = (("csv files","*.csv"),("all files","*.*"))) self.input_csv_entry.delete(0, END) self.input_csv_entry.insert(0, filename) def open_aspen_file(self): filename = askopenfilename(title = "Select file", filetypes = (("Aspen Models",["*.bkp", "*.apw"]),("all files","*.*"))) self.aspen_file_entry.delete(0, END) self.aspen_file_entry.insert(0, filename) def open_solver_file(self): filename = askopenfilename(title = "Select file", filetypes = (("Excel Files","*.xlsm"),("all files","*.*"))) self.excel_solver_entry.delete(0, END) self.excel_solver_entry.insert(0, filename) def abort_sim(self): self.abort.value = True self.cleanup_thread = Thread(target=self.cleanup_processes_and_COMS) self.cleanup_thread.start() def abort_univar_overall_fun(self): self.abort_univar_overall.value = True self.abort_sim() def cleanup_processes_and_COMS(self): try: self.current_simulation.close_all_COMS() self.current_simulation.terminate_processes() save_data(self.current_simulation.output_file, self.current_simulation.results, self.current_simulation.directory) except: self.after(1000, self.cleanup_processes_and_COMS)