def initGUI(self): #create root window self.rootWindow = Tk() self.statusText = StringVar(value=self.statusStr) self.setStatusStr("Simulation not yet started") self.rootWindow.wm_title(self.titleText) self.rootWindow.protocol('WM_DELETE_WINDOW', self.quitGUI) self.rootWindow.geometry('550x700') self.rootWindow.columnconfigure(0, weight=1) self.rootWindow.rowconfigure(0, weight=1) self.frameSim = Frame(self.rootWindow) self.frameSim.pack(expand=YES, fill=BOTH, padx=5, pady=5, side=TOP) self.status = Label(self.rootWindow, width=40, height=3, relief=SUNKEN, bd=1, textvariable=self.statusText) self.status.pack(side=TOP, fill=X, padx=1, pady=1, expand=NO) self.runPauseString = StringVar() self.runPauseString.set("Run") self.buttonRun = Button(self.frameSim, width=30, height=2, textvariable=self.runPauseString, command=self.runEvent) self.buttonRun.pack(side=TOP, padx=5, pady=5) self.showHelp(self.buttonRun, "Runs the simulation (or pauses the running simulation)") self.buttonStep = Button(self.frameSim, width=30, height=2, text="Step Once", command=self.stepOnce) self.buttonStep.pack(side=TOP, padx=5, pady=5) self.showHelp(self.buttonStep, "Steps the simulation only once") self.buttonReset = Button(self.frameSim, width=30, height=2, text="Reset", command=self.resetModel) self.buttonReset.pack(side=TOP, padx=5, pady=5) self.showHelp(self.buttonReset, "Resets the simulation") for param in self.model.params: var_text = self.param_gui_names.get(param, param) can = Canvas(self.frameSim) lab = Label(can, width=25, height=1 + var_text.count('\n'), text=var_text, anchor=W, takefocus=0) lab.pack(side='left') val = getattr(self.model, param) if isinstance(val, bool): ent = BooleanVar(value=val) field = Checkbutton(can, variable=ent, width=12) else: field = Entry(can, width=11) ent = field ent.insert(0, str(val)) field.pack(side='left') can.pack(side='top') self.param_entries[param] = ent if self.param_entries: self.buttonSaveParameters = Button(self.frameSim, width=50, height=1, command=self.saveParametersCmd, text="Save parameters to the running model", state=DISABLED) self.showHelp(self.buttonSaveParameters, "Saves the parameter values.\n" + "Not all values may take effect on a running model\n" + "A model reset might be required.") self.buttonSaveParameters.pack(side='top', padx=5, pady=5) self.buttonSaveParametersAndReset = Button(self.frameSim, width=50, height=1, command=self.saveParametersAndResetCmd, text="Save parameters to the model and reset the model") self.showHelp(self.buttonSaveParametersAndReset, "Saves the given parameter values and resets the model") self.buttonSaveParametersAndReset.pack(side='top', padx=5, pady=5) can = Canvas(self.frameSim) lab = Label(can, width=25, height=1, text="Step size ", justify=LEFT, anchor=W, takefocus=0) lab.pack(side='left') self.stepScale = Scale(can, from_=1, to=500, resolution=1, command=self.changeStepSize, orient=HORIZONTAL, width=25, length=150) self.stepScale.set(self.stepSize) self.showHelp(self.stepScale, "Skips model redraw during every [n] simulation steps\n" + "Results in a faster model run.") self.stepScale.pack(side='left') can.pack(side='top') can = Canvas(self.frameSim) lab = Label(can, width=25, height=1, text="Step visualization delay in ms ", justify=LEFT, anchor=W, takefocus=0) lab.pack(side='left') self.stepDelay = Scale(can, from_=0, to=max(2000, self.timeInterval), resolution=10, command=self.changeStepDelay, orient=HORIZONTAL, width=25, length=150) self.stepDelay.set(self.timeInterval) self.showHelp(self.stepDelay, "The visualization of each step is " + "delays by the given number of " + "milliseconds.") self.stepDelay.pack(side='left') can.pack(side='top')