예제 #1
0
    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)
예제 #2
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()
예제 #3
0
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)
예제 #4
0
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]))
예제 #5
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"
예제 #6
0
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)
예제 #7
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)
예제 #8
0
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)
예제 #9
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
예제 #10
0
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)
예제 #11
0
파일: gui.py 프로젝트: karacho84/dinnerlog
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")
예제 #12
0
파일: gui.py 프로젝트: karacho84/dinnerlog
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")
예제 #13
0
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)
예제 #15
0
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)