class UserDefined: def __init__(self, master, system, reactants): """Constructor method. Makes the GUI using the list of "Layer" objects "layers." """ self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.bgcolor = self.frame.cget('bg') self.top = None self.reactants = reactants def make_widgets(self): self.instructions = Label( self.frame, text= ' Please input the rate index of each chemical in the reaction kinetic equation ' ) self.label = Label(self.frame, text='Reactants') self.widget = Label(self.frame, text='Rate index') self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') self.blank3 = Label(self.frame, text=' ', width=2) self.blank4 = Label(self.frame, text=' ', width=2) self.okbutton = Button(self.frame, text='OK', width=20, command=self.OK) self.instructions.grid(row=0, column=0, columnspan=2) self.blank1.grid(row=1, column=0, columnspan=2) self.label.grid(row=2, column=0, padx=4, pady=2) self.widget.grid(row=2, column=1, padx=4, pady=2) row = 3 for reactant in self.reactants: try: reactant.remove_indexwidgets() except: pass reactant.indexwidgets(self.frame, row) row = row + 1 self.blank2.grid(row=row, column=0, columnspan=2) row = row + 1 self.okbutton.grid(row=row, columnspan=2) self.focusbutton = self.okbutton def OK(self, event=None): self.master.tk.quit()
class LayerDeleter: def __init__(self, master, system, layer): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) #superscript font self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.top = None #flag for existence of toplevel# self.type = layer.type self.tort = layer.tort self.h = layer.h self.alpha = layer.alpha self.doc = layer.doc self.layer = layer self.cancelflag = 0 def make_widgets(self): self.bgcolor = self.frame.cget('bg') self.instructions = Label( self.frame, text= ' Are you sure to delete the following layer? ') self.namelabel = Label(self.frame, text='Layer') self.typelabel = Label(self.frame, text='Material') self.tortlabel = Label(self.frame, text='Tortuosity Correction') self.hlabel = Label(self.frame, text='Thickness') self.alphalabel = Label(self.frame, text='Hydrodynamic\n' + 'Dispersivity') self.doclabel = Label(self.frame, text='Dissolved organic\n' + 'matter concentration ') if self.layer.number == 0: self.namewidget = Label(self.frame, text='Deposition') else: self.namewidget = Label(self.frame, text='Layer ' + str(self.layer.number)) self.typewidget = Label(self.frame, text=self.type) self.tortwidget = Label(self.frame, text=self.tort) self.hwidget = Label(self.frame, text=self.h, width=10) self.alphawidget = Label(self.frame, text=self.alpha, width=10) self.docwidget = Label(self.frame, text=self.doc, width=10) self.thickunits = Label(self.frame, text='cm') self.depthickunits = Label(self.frame, text='cm/yr') self.alphaunits = Label(self.frame, text='cm') self.docunits = Label(self.frame, text='mg/L') self.blankcolumn = Label(self.frame, text=' ', width=2) self.namecolumn = Label(self.frame, text=' ', width=14) self.typecolumn = Label(self.frame, text=' ', width=18) self.tortcolumn = Label(self.frame, text=' ', width=20) self.thickcolumn = Label(self.frame, text=' ', width=12) self.alphacolumn = Label(self.frame, text=' ', width=12) self.doccolumn = Label(self.frame, text=' ', width=12) self.deletebutton = Button(self.frame, text='Delete', width=20, command=self.Delete) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.Cancel) self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') #show the widgets on the grid self.instructions.grid(row=0, column=0, columnspan=6, padx=8, sticky='W') self.blankcolumn.grid(row=1, column=0) self.namecolumn.grid(row=1, column=1) self.typecolumn.grid(row=1, column=2) self.tortcolumn.grid(row=1, column=3) self.thickcolumn.grid(row=1, column=4) self.alphacolumn.grid(row=1, column=5) self.doccolumn.grid(row=1, column=6) self.namelabel.grid(row=2, column=1, sticky='WE', padx=4, pady=1) self.typelabel.grid(row=2, column=2, sticky='WE', padx=1, pady=1) self.tortlabel.grid(row=2, column=3, sticky='WE', padx=1, pady=1) self.hlabel.grid(row=2, column=4, sticky='WE', padx=1, pady=1) self.alphalabel.grid(row=2, column=5, sticky='WE', padx=1, pady=1) self.doclabel.grid(row=2, column=6, sticky='WE', padx=1, pady=1) if self.layer.number == 0: self.depthickunits.grid(row=3, column=4, sticky='WE', padx=1, pady=1) else: self.thickunits.grid(row=3, column=4, sticky='WE', padx=1, pady=1) self.alphaunits.grid(row=3, column=5, sticky='WE', padx=1, pady=1) self.docunits.grid(row=3, column=6, sticky='WE', padx=1, pady=1) self.namewidget.grid(row=4, column=1, sticky='WE', padx=1, pady=1) self.typewidget.grid(row=4, column=2, sticky='WE', padx=1, pady=1) self.tortwidget.grid(row=4, column=3, sticky='WE', padx=1, pady=1) self.hwidget.grid(row=4, column=4, sticky='WE', padx=1, pady=1) self.alphawidget.grid(row=4, column=5, sticky='WE', padx=1, pady=1) self.docwidget.grid(row=4, column=6, sticky='WE', padx=1, pady=1) self.blank1.grid(row=5) self.deletebutton.grid(row=6, columnspan=11) self.cancelbutton.grid(row=7, columnspan=11) self.blank2.grid(row=8) self.deletebutton.bind('<Return>', self.Delete) self.focusbutton = self.deletebutton def Delete(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit() def Cancel(self): try: self.number.set(self.layer.number) self.type.set(self.layer.type) self.tort.set(self.layer.tort) self.h.set(self.layer.h) self.alpha.set(self.layer.alpha) self.doc.set(self.layer.doc) except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
def cget(self, item): return Frame.cget(self, item) if not hasattr(self, item) else getattr( self, item)
class SolidDatabaseEditor: """Gets the contaminant properties.""" def __init__(self, master, system, solid, solid_database, editflag): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) #superscript font self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.top = None #flag for existence of toplevel# self.solid = solid self.solid_database = solid_database self.torts = ['Millington & Quirk', 'Boudreau', 'None'] self.sorps = [ 'Linear--Kd specified', 'Linear--Kocfoc', 'Freundlich', 'Langmuir' ] self.name = StringVar( value='Solid ' + str(solid_database[-1].number)) #stores the chemical name self.e = DoubleVar(value=0.5) #stores the porosity self.rho = DoubleVar(value=1.0) #stores the bulk density self.foc = DoubleVar(value=0.01) #stores the organic carbon fraction self.tort = StringVar( value=self.torts[0]) #stores the default tortuosity correction self.sorp = StringVar( value=self.sorps[0]) #stores the default sorption correction self.Ref = StringVar(value='') #stores the density self.editflag = editflag self.cancelflag = 0 if editflag == 1: #Detemine whether the chemical is added or edited self.name.set(solid.name) self.e.set(solid.e) self.rho.set(solid.rho) self.foc.set(solid.foc) self.tort.set(solid.tort) self.sorp.set(solid.sorp) self.Ref.set(solid.Ref) def make_widgets(self): """Make the widgets for the window.""" self.bgcolor = self.frame.cget('bg') self.instructions = Label( self.frame, text= ' Please provide the following properties for the solid/mixture: ' ) self.blankcolumn = Label(self.frame, text=' ', width=1) self.namecolumn = Label(self.frame, text=' ', width=18) self.ecolumn = Label(self.frame, text=' ', width=10) self.rhocolumn = Label(self.frame, text=' ', width=10) self.foccolumn = Label(self.frame, text=' ', width=10) self.tortcolumn = Label(self.frame, text=' ', width=18) self.sorpcolumn = Label(self.frame, text=' ', width=20) self.refcolumn = Label(self.frame, text=' ', width=18) self.endcolumn = Label(self.frame, text=' ', width=2) self.namelabel = Label(self.frame, text='Material') self.elabel = Label(self.frame, text='Porosity') self.rholabel = Label(self.frame, text='Bulk density') self.foclabel = Label(self.frame, text='Organic carbon fraction') self.tortlabel = Label(self.frame, text='Tortruosity correction') self.sorplabel = Label(self.frame, text='Sorption isotherms') self.reflabel = Label(self.frame, text='Reference') self.rhounitlabel = Label(self.frame, text=u'g/cm\u00B3') self.namewidget = Entry(self.frame, width=16, justify='center', textvariable=self.name) self.ewidget = Entry(self.frame, width=8, justify='center', textvariable=self.e) self.rhowidget = Entry(self.frame, width=8, justify='center', textvariable=self.rho) self.focwidget = Entry(self.frame, width=8, justify='center', textvariable=self.foc) self.tortwidget = OptionMenu(self.frame, self.tort, *self.torts) self.sorpwidget = OptionMenu(self.frame, self.sorp, *self.sorps) self.refwidget = Entry(self.frame, width=15, justify='center', textvariable=self.Ref) self.okbutton = Button(self.frame, text='OK', width=20, command=self.OK) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.Cancel) self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') #show the widgets on the grid self.instructions.grid(row=0, column=0, columnspan=7, padx=8, sticky='W') self.blankcolumn.grid(row=1, column=0, sticky='WE', padx=1, pady=1) self.namecolumn.grid(row=1, column=1, sticky='WE', padx=1, pady=1) self.ecolumn.grid(row=1, column=2, sticky='WE', padx=1, pady=1) self.rhocolumn.grid(row=1, column=3, sticky='WE', padx=1, pady=1) self.foccolumn.grid(row=1, column=4, sticky='WE', padx=1, pady=1) self.tortcolumn.grid(row=1, column=5, sticky='WE', padx=1, pady=1) self.sorpcolumn.grid(row=1, column=6, sticky='WE', padx=1, pady=1) self.refcolumn.grid(row=1, column=7, sticky='WE', padx=1, pady=1) self.endcolumn.grid(row=1, column=8, sticky='WE', padx=1, pady=1) self.namelabel.grid(row=2, column=1, sticky='WE', padx=1, pady=1) self.elabel.grid(row=2, column=2, sticky='WE', padx=1, pady=1) self.rholabel.grid(row=2, column=3, sticky='WE', padx=1, pady=1) self.foclabel.grid(row=2, column=4, sticky='WE', padx=1, pady=1) self.tortlabel.grid(row=2, column=5, sticky='WE', padx=1, pady=1) self.sorplabel.grid(row=2, column=6, sticky='WE', padx=1, pady=1) self.reflabel.grid(row=2, column=7, sticky='WE', padx=1, pady=1) self.rhounitlabel.grid(row=3, column=3, sticky='WE', padx=1, pady=1) self.namewidget.grid(row=4, column=1, padx=1, pady=1) self.ewidget.grid(row=4, column=2, padx=1, pady=1) self.rhowidget.grid(row=4, column=3, padx=1, pady=1) self.focwidget.grid(row=4, column=4, padx=1, pady=1) self.tortwidget.grid(row=4, column=5, padx=1, pady=1, sticky='WE') self.sorpwidget.grid(row=4, column=6, padx=1, pady=1, sticky='WE') self.refwidget.grid(row=4, column=7, padx=1, pady=1) self.blank1.grid(row=5) self.okbutton.grid(row=6, columnspan=11) self.cancelbutton.grid(row=7, columnspan=11) self.blank2.grid(row=8) self.okbutton.bind('<Return>', self.OK) self.focusbutton = self.okbutton def OK(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.editflag == 0: check = [(solid.name == self.name.get()) for solid in self.solid_database[0:-1]] if self.editflag == 1: check = [(solid.name == self.name.get() and self.solid.name != self.name.get()) for solid in self.solid_database[0:-1]] if self.master.window.top is not None: self.master.open_toplevel() elif self.e.get() > 1 or self.e.get() < 0: tkmb.showinfo( self.version, 'The porosity of a solid can not be larger than 1 or smaller than 0' ) self.e.set(0.5) elif self.rho.get() < 0: tkmb.showinfo(self.version, 'The bulk density of a solid can not be negative') self.e.set(1.0) elif self.foc.get() > 1 or self.foc.get() < 0: tkmb.showinfo( self.version, 'The organic carbon fraction of a solid can not be larger than 1 or smaller than 0' ) self.e.set(1.0) elif sum(check) >= 1 or self.name.get() == '': self.solids_error() else: self.master.tk.quit() def solids_error(self): tkmb.showerror( title=self.version, message= 'This solid material has already been added to the database!') self.focusbutton = self.okbutton self.master.tk.lift() def Cancel(self): try: self.name.set(self.solid.name) self.e.set(self.solid.e) self.rho.set(self.solid.rho) self.foc.set(self.solid.foc) self.tort.set(self.solid.tort) self.sorp.set(self.solid.sorp) self.Ref.set(self.solid.Ref) except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class ChemicalEditor: """Gets the contaminant properties.""" def __init__(self, master, system, chemical, chemicals, database, editflag): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) #superscript font self.frame = Frame(master.frame) self.tframe = Frame(master.tframe) self.bframe = Frame(master.bframe) self.system = system self.database = database self.top = None #flag for existence of toplevel# self.tkfont = tkFont.Font(font=system.fonttype) self.soluableflag = chemical.soluable self.editflag = editflag self.cancelflag = 0 self.chemicals = chemicals self.diffunit = system.diffunit self.diffunits = system.diffunits if self.soluableflag == 1: self.database = database self.chemical = chemical self.name = StringVar(value='') self.formula = StringVar(value='') self.MW = DoubleVar(value=0) self.temp = DoubleVar(value=0) self.Dw = DoubleVar(value=0) self.Ref = StringVar(value='') self.Koc = DoubleVar(value=0) self.Kdoc = DoubleVar(value=0) self.Kf = DoubleVar(value=0) self.N = DoubleVar(value=0) if editflag == 1: #Detemine whether the chemical is added or edited self.name.set(self.chemical.name) self.formula.set(self.chemical.formula) self.MW.set(self.chemical.MW) self.temp.set(self.chemical.temp) self.Dw.set(self.chemical.Dw) self.Koc.set(self.chemical.Koc) self.Kdoc.set(self.chemical.Kdoc) self.Ref.set(self.chemical.Ref) self.Kf.set(self.chemical.Kf) self.N.set(self.chemical.N) else: self.name = StringVar(value=' ') self.formula = StringVar(value=' ') self.MW = DoubleVar(value=100) self.temp = DoubleVar(value=0) self.Dw = DoubleVar(value=0) self.Koc = DoubleVar(value=0) self.Kdoc = DoubleVar(value=0) self.Kf = DoubleVar(value=0) self.N = DoubleVar(value=0) if editflag == 1: #Detemine whether the chemical is added or edited self.name.set(chemical.name) def make_widgets(self): """Make the widgets for the window.""" self.bgcolor = self.frame.cget('bg') self.instructions = Label( self.tframe, text= ' Please provide the following chemical properties: ' ) self.blankcolumn = Label(self.frame, text=' ', width=2) self.namecolumn = Label(self.frame, text=' ', width=20) self.MWcolumn = Label(self.frame, text=' ', width=12) self.tempcolumn = Label(self.frame, text=' ', width=10) self.Dwcolumn = Label(self.frame, text=' ', width=18) self.Koccolumn = Label(self.frame, text=' ', width=18) self.Kdoccolumn = Label(self.frame, text=' ', width=18) self.Refcolumn = Label(self.frame, text=' ', width=20) self.Rightcolumn = Label(self.frame, text=' ', width=2) self.namelabel = Label(self.frame, text='Chemical name') self.MWlabel = Label(self.frame, text='Molecular\n weight') self.templabel = Label(self.frame, text='Temperature') self.Dwlabel = Label(self.frame, text='Molecular diffusivity\n in water') self.Koclabel = Label(self.frame, text='Organic carbon\n partition coefficient') self.Kdoclabel = Label( self.frame, text='Dissolved organic carbon\n partition coefficient') self.Reflabel = Label(self.frame, text='Reference') self.tempunits = Label(self.frame, text=unichr(176) + 'C') self.Dwunits = Label(self.frame, text=self.diffunit) self.Kocunits = Label(self.frame, text='log(L/kg)') self.Kdocunits = Label(self.frame, text='log(L/kg)') self.importbutton = Button(self.frame, text='From Database', width=20, command=self.importchemical) self.okbutton = Button(self.frame, text='OK', width=20, command=self.OK) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.Cancel) self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') #show the widgets on the grid self.instructions.grid(row=0, column=0, columnspan=6, padx=8, sticky='W') self.blankcolumn.grid(row=1, column=0, sticky='WE', padx=1, pady=1) self.namecolumn.grid(row=1, column=1, sticky='WE', padx=1, pady=1) self.MWcolumn.grid(row=1, column=2, sticky='WE', padx=1, pady=1) self.tempcolumn.grid(row=1, column=3, sticky='WE', padx=1, pady=1) self.Dwcolumn.grid(row=1, column=4, sticky='WE', padx=1, pady=1) self.Koccolumn.grid(row=1, column=5, sticky='WE', padx=1, pady=1) self.Kdoccolumn.grid(row=1, column=6, sticky='WE', padx=1, pady=1) self.Refcolumn.grid(row=1, column=7, sticky='WE', padx=1, pady=1) self.Rightcolumn.grid(row=1, column=8, sticky='WE', padx=1, pady=1) self.namelabel.grid(row=2, column=1, sticky='WE', padx=1, pady=1) self.MWlabel.grid(row=2, column=2, sticky='WE', padx=1, pady=1) self.templabel.grid(row=2, column=3, sticky='WE', padx=1, pady=1) self.Dwlabel.grid(row=2, column=4, sticky='WE', padx=1, pady=1) self.Koclabel.grid(row=2, column=5, sticky='WE', padx=1, pady=1) self.Kdoclabel.grid(row=2, column=6, sticky='WE', padx=1, pady=1) self.Reflabel.grid(row=2, column=7, sticky='WE', padx=1, pady=1) self.tempunits.grid(row=3, column=3, sticky='WE', padx=1, pady=1) self.Dwunits.grid(row=3, column=4, sticky='WE', padx=1, pady=1) self.Kocunits.grid(row=3, column=5, sticky='WE', padx=1, pady=1) self.Kdocunits.grid(row=3, column=6, sticky='WE', padx=1, pady=1) if self.soluableflag == 1: if self.editflag == 0: self.namewidget = Entry(self.frame, width=18, justify='center', textvariable=self.name) self.tempwidget = Entry(self.frame, width=10, justify='center', textvariable=self.temp) else: self.namewidget = Label(self.frame, width=18, justify='center', textvariable=self.name) self.tempwidget = Label(self.frame, width=10, justify='center', textvariable=self.temp) self.Dwwidget = Entry(self.frame, width=16, justify='center', textvariable=self.Dw) self.MWwidget = Entry(self.frame, width=10, justify='center', textvariable=self.MW) self.Kocwidget = Entry(self.frame, width=16, justify='center', textvariable=self.Koc) self.Kdocwidget = Entry(self.frame, width=16, justify='center', textvariable=self.Kdoc) self.Refwidget = Entry(self.frame, width=18, justify='center', textvariable=self.Ref) self.namewidget.grid(row=4, column=1, padx=2, pady=1) self.MWwidget.grid(row=4, column=2, padx=2, pady=1) self.tempwidget.grid(row=4, column=3, padx=2, pady=1) self.Dwwidget.grid(row=4, column=4, padx=2, pady=1) self.Kocwidget.grid(row=4, column=5, padx=2, pady=1) self.Kdocwidget.grid(row=4, column=6, padx=2, pady=1) self.Refwidget.grid(row=4, column=7, padx=2, pady=1) else: self.namewidget = Entry(self.frame, width=18, justify='center', textvariable=self.name) self.Dwwidget = Label(self.frame, width=16, justify='center', text='Not applicable') self.Kocwidget = Label(self.frame, width=16, justify='center', text='Not applicable') self.Kdocwidget = Label(self.frame, width=16, justify='center', text='Not applicable') self.namewidget.grid(row=4, column=1, padx=2, pady=1) self.Dwwidget.grid(row=4, column=3, padx=2, pady=1) self.Kocwidget.grid(row=4, column=4, padx=2, pady=1) self.Kdocwidget.grid(row=4, column=5, padx=2, pady=1) self.blank1.grid(row=5) if self.editflag == 0: self.importbutton.grid(row=6, columnspan=11) self.okbutton.grid(row=7, columnspan=11) self.cancelbutton.grid(row=8, columnspan=11) self.blank2.grid(row=9) self.okbutton.bind('<Return>', self.OK) self.focusbutton = self.okbutton if int((self.tkfont.measure(self.Ref.get()) + 10) * 1.1424219345 / 8) + 1 > 18: self.Refwidget.config( width=int((self.tkfont.measure(self.Ref.get()) + 10) * 1.1424219345 / 8) + 3) if int((self.tkfont.measure(self.name.get()) + 10) * 1.1424219345 / 8) + 1 > 18: self.namewidget.config( width=int((self.tkfont.measure(self.name.get()) + 10) * 1.1424219345 / 8) + 3) self.master.geometry() self.master.center() def importchemical(self): if self.top is None: self.top = CapSimWindow(master=self.master, buttons=2) self.top.make_window( ChemicalImporter(self.top, self.system, self.database)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.updatechemical(self.top.window) if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror( title=self.system.version, message= 'Please close the existing parameter input window first.') self.top.tk.focus() def updatechemical(self, window): self.name.set(window.name.get()) self.formula.set(window.formula.get()) self.MW.set(window.MW.get()) self.temp.set(window.temp.get()) self.Koc.set(window.Koc.get()) self.Kdoc.set(window.Kdoc.get()) self.Ref.set(window.Ref.get()) self.Kf.set(window.Kf.get()) self.N.set(window.N.get()) if self.diffunit == self.diffunits[0]: self.Dw.set(window.Dw.get()) elif self.diffunit == self.diffunits[1]: Dw = window.Dw.get() * 86400 * 365 if Dw > 1: self.Dw.set(round(Dw, 2)) else: i = 2 while Dw / 100 < 0.1**i: i = i + 1 self.Dw.set(round(Dw, i)) self.frame.update() if int((self.tkfont.measure(self.Ref.get()) + 10) * 1.1424219345 / 8) + 1 > 20: self.Refwidget.config( width=int((self.tkfont.measure(self.Ref.get()) + 10) * 1.1424219345 / 8) + 3) if int((self.tkfont.measure(self.name.get()) + 10) * 1.1424219345 / 8) + 1 > 20: self.namewidget.config( width=int((self.tkfont.measure(self.name.get()) + 10) * 1.1424219345 / 8) + 3) self.master.geometry() self.master.center() def OK(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.editflag == 0: check = [(chemical.name == self.name.get()) for chemical in self.chemicals[0:-1]] else: check = [0] if self.master.window.top is not None: self.master.open_toplevel() elif sum(check) >= 1: self.chemicals_error() elif self.name.get() == '' or self.name.get().count(' ') == len( self.name.get()): self.name_error() elif self.Dw.get() == 0: self.Dw_error() else: self.master.tk.quit() def chemicals_error(self): tkmb.showerror(title=self.version, message='This chemical has already been selected!') self.focusbutton = self.okbutton self.master.tk.lift() def name_error(self): tkmb.showerror(title=self.version, message='Please input the name for the chemical!') self.focusbutton = self.okbutton self.master.tk.lift() def Dw_error(self): tkmb.showerror( title=self.version, message= 'The diffusivity of the chemical can not be zero, please correct!') self.focusbutton = self.okbutton self.master.tk.lift() def Cancel(self): try: self.name.set(self.chemical.name) self.MW.set(self.chemical.MW.get()) self.formula.set(self.chemical.formula.get()) self.temp.set(self.chemical.temp.get()) self.Dw.set(self.chemical.Dw.get()) self.Koc.set(self.chemical.Koc.get()) self.Kdoc.set(self.chemical.Kdoc.get()) self.Ref.set(self.chemical.Ref.get()) self.Kf.set(self.chemical.Kf.get()) self.N.set(self.chemical.N.get()) except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class SystemProperties: """Gets the flow and contaminant properties.""" def __init__(self, master, system): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.system = system self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) #superscript font self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.advs = ['None', 'Steady flow', 'Period oscillation'] self.bios = ['None', 'Uniform', 'Depth-dependent'] self.cons = ['None', 'Consolidation'] self.adv = StringVar(value=self.advs[0]) #tidal flag self.bio = StringVar(value=self.bios[0]) #bioturbation flag self.con = StringVar(value=self.cons[0]) #consolidation flag self.hbio = DoubleVar(value=10.) #bioturbation depth self.sigma = DoubleVar(value=10.) #bioturbation depth self.Dbiop = DoubleVar(value=1.) #particle bioturbation coeff self.Dbiopw = DoubleVar(value=100.) #pore water bioturbation coeff self.Vdar = DoubleVar(value=0.) #Darcy velocity self.Vtidal = DoubleVar(value=0.) #Tidal velocity self.ptidal = DoubleVar(value=0.0014) #Tidal frequency self.hcon = DoubleVar(value=0) #total consolidation self.t90 = DoubleVar(value=1.) #time to 90% consolidation self.top = None #flag for existence of toplevel if system.layers[0].number == 0: self.toplayer_h = system.layers[1].h else: self.toplayer_h = system.layers[0].h self.lengthunit = system.lengthunit self.timeunit = system.timeunit self.diffunit = system.diffunit self.diffunits = system.diffunits try: self.adv.set(system.adv) self.bio.set(system.bio) self.con.set(system.con) self.Vdar.set(system.Vdar) self.hbio.set(system.hbio) self.sigma.set(system.sigma) self.Dbiop.set(system.Dbiop) self.Dbiopw.set(system.Dbiopw) self.Vtidal.set(system.Vtidal) self.ptidal.set(system.ptidal) self.hcon.set(system.hcon) self.t90.set(system.t90) except: pass def make_widgets(self): """Make the widgets for the window.""" self.bgcolor = self.frame.cget('bg') self.instructions = Label( self.frame, text= ' Please provide the information of the following system properties: ' ) self.blank1 = Label(self.frame, width=30) self.blank2 = Label(self.frame, width=20) self.blank3 = Label(self.frame, width=15) self.blank4 = Label(self.frame, width=20) self.headings1 = Label(self.frame, text='Parameter') self.headings2 = Label(self.frame, text='Value') self.headings3 = Label(self.frame, text='Units') self.advlabel = Label(self.frame, text='Upwelling groundwater flow') self.advwidget = OptionMenu(self.frame, self.adv, *self.advs, command=self.updatesystem) self.Vdarlabel = Label(self.frame, text='Darcy velocity:') self.Vtidallabel = Label(self.frame, text='Oscillation maximum velocity:') self.ptidallabel = Label(self.frame, text='Oscillation period:') self.Vdarwidget = Entry(self.frame, width=10, textvariable=self.Vdar, justify='center') self.Vtidalwidget = Entry(self.frame, width=10, textvariable=self.Vtidal, justify='center') self.ptidalwidget = Entry(self.frame, width=10, textvariable=self.ptidal, justify='center') self.Vdarunits = Label(self.frame, text=self.lengthunit + '/' + self.timeunit) self.Vtidalunits = Label(self.frame, text=self.lengthunit + '/' + self.timeunit) self.ptidalunits = Label(self.frame, text=self.timeunit) self.biolabel = Label(self.frame, text='Modeling bioturbation') self.biowidget = OptionMenu(self.frame, self.bio, *self.bios, command=self.updatesystem) self.hbiolabel = Label(self.frame, text='Bioturbation depth:') self.sigmalabel = Label(self.frame, text='Gaussian model coefficient:') self.Dbioplabel = Label(self.frame, text='Particle biodiffusion coefficient:') self.Dbiopwlabel = Label(self.frame, text='Pore water biodiffusion coefficient:') self.hbiowidget = Entry(self.frame, width=10, textvariable=self.hbio, justify='center') self.sigmawidget = Entry(self.frame, width=10, textvariable=self.sigma, justify='center') self.Dbiopwidget = Entry(self.frame, width=10, textvariable=self.Dbiop, justify='center') self.Dbiopwwidget = Entry(self.frame, width=10, textvariable=self.Dbiopw, justify='center') self.hbiounits = Label(self.frame, text=self.lengthunit) self.Dbiopunits = Label(self.frame, text=self.diffunits[1]) self.Dbiopwunits = Label(self.frame, text=self.diffunits[1]) self.conlabel = Label(self.frame, text='Modeling consolidation') self.conwidget = OptionMenu(self.frame, self.con, *self.cons, command=self.updatesystem) self.hconlabel = Label(self.frame, text='Maximum consolidation depth:') self.t90label = Label(self.frame, text='Time to 90% consolidation:') self.hconwidget = Entry(self.frame, width=10, textvariable=self.hcon, justify='center') self.t90widget = Entry(self.frame, width=10, textvariable=self.t90, justify='center') self.hconunits = Label(self.frame, text=self.lengthunit) self.t90units = Label(self.frame, text=self.timeunit) self.advwidget.config(width=20) self.biowidget.config(width=20) self.conwidget.config(width=20) #self.okbutton = Button(self.frame, text = 'OK', command = self.OK, width = 20) #show the widgets on the grid self.instructions.grid(row=0, column=0, columnspan=3, padx=6, sticky='W') self.blank1.grid(row=1, column=0) self.blank2.grid(row=1, column=1) self.blank3.grid(row=1, column=2) self.row = 3 self.focusbutton = None self.updatesystem() def updatesystem(self, event=None): try: self.advlabel.grid_forget() self.advwidget.grid_forget() self.Vdarlabel.grid_forget() self.Vdarwidget.grid_forget() self.Vdarunits.grid_forget() self.Vtidallabel.grid_forget() self.Vtidalwidget.grid_forget() self.Vtidalunits.grid_forget() self.ptidallabel.grid_forget() self.ptidalwidget.grid_forget() self.ptidalunits.grid_forget() self.biolabel.grid_forget() self.biowidget.grid_forget() self.sigmalabel.grid_forget() self.sigmawidget.grid_forget() self.hbiolabel.grid_forget() self.hbiowidget.grid_forget() self.hbiounits.grid_forget() self.Dbioplabel.grid_forget() self.Dbiopwidget.grid_forget() self.Dbiopunits.grid_forget() self.Dbiopwlabel.grid_forget() self.Dbiopwwidget.grid_forget() self.Dbiopwunits.grid_forget() self.conlabel.grid_forget() self.conwidget.grid_forget() self.hconlabel.grid_forget() self.hconwidget.grid_forget() self.hconunits.grid_forget() self.t90label.grid_forget() self.t90widget.grid_forget() self.t90units.grid_forget() except: pass row = self.row self.advlabel.grid(row=row, column=0, sticky='E', padx=4) self.advwidget.grid(row=row, column=1, sticky='W', padx=4, columnspan=2) row = row + 1 if self.adv.get() == self.advs[1] or self.adv.get() == self.advs[2]: self.Vdarlabel.grid(row=row, column=0, sticky='E', padx=4) self.Vdarwidget.grid(row=row, column=1, pady=1) self.Vdarunits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 if self.adv.get() == self.advs[2]: self.Vtidallabel.grid(row=row, column=0, sticky='E', padx=4) self.Vtidalwidget.grid(row=row, column=1, pady=1) self.Vtidalunits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 self.ptidallabel.grid(row=row, column=0, sticky='E', padx=4) self.ptidalwidget.grid(row=row, column=1, pady=1) self.ptidalunits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 self.biolabel.grid(row=row, column=0, sticky='E', padx=4) self.biowidget.grid(row=row, column=1, sticky='W', padx=4, columnspan=2) row = row + 1 if self.bio.get() == self.bios[1]: self.hbiolabel.grid(row=row, column=0, sticky='E', padx=4) self.hbiowidget.grid(row=row, column=1, pady=1) self.hbiounits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 if self.bio.get() == self.bios[2]: self.sigmalabel.grid(row=row, column=0, sticky='E', padx=4) self.sigmawidget.grid(row=row, column=1, pady=1) self.hbiounits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 if self.bio.get() == self.bios[1] or self.bio.get() == self.bios[2]: self.Dbioplabel.grid(row=row, column=0, sticky='E', padx=4) self.Dbiopwidget.grid(row=row, column=1, pady=1) self.Dbiopunits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 self.Dbiopwlabel.grid(row=row, column=0, sticky='E', padx=4) self.Dbiopwwidget.grid(row=row, column=1, pady=1) self.Dbiopwunits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 self.conlabel.grid(row=row, column=0, sticky='E', padx=4) self.conwidget.grid(row=row, column=1, sticky='W', padx=4, columnspan=2) row = row + 1 if self.con.get() == self.cons[1]: self.hconlabel.grid(row=row, column=0, sticky='E', padx=4) self.hconwidget.grid(row=row, column=1, pady=1) self.hconunits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 self.t90label.grid(row=row, column=0, sticky='E', padx=4) self.t90widget.grid(row=row, column=1, pady=1) self.t90units.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 self.blank4.grid(row=row) row = row + 1 self.focusbutton = None self.master.geometry() def error_check(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" error = 0 #if self.bio.get() == self.bios[1] and self.hbio.get() > self.toplayer_h: error = 1 return error def warning(self): tkmb.showerror( title=self.version, message='The bioturbation ' + 'depth (%.1f cm) ' % self.hbio.get() + 'cannot exceed the ' + 'thickness of the top layer (%.1f). ' % self.toplayer_h + 'Automatically increasing ' + 'the thickness of the top layer to the bioturbation ' + 'depth.') self.hbio.set(self.toplayer_h) self.focusbutton = None self.master.tk.lift()
class MatrixProperties: """Gets the contaminant properties.""" def __init__(self, master, system, materials): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) #superscript font self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.top = None #flag for existence of toplevel# self.system = system self.materials = materials if system.matrices is None: self.matrices = [] self.nmatrices = 0 else: self.matrices = system.matrices self.nmatrices = system.nmatrices def make_widgets(self): """Make the widgets for the window.""" self.bgcolor = self.frame.cget('bg') # Construct all label widgets used in the problem self.instructions = Label(self.tframe, text = ' Please select the potential layer materials and provide the following properties: ') self.blankcolumn = Label(self.tframe, text ='', width = 1) self.editcolumn = Label(self.tframe, text =' ', width = 6) self.delcolumn = Label(self.tframe, text =' ', width = 6) self.namecolumn = Label(self.tframe, text =' ', width = 20) self.ecolumn = Label(self.tframe, text =' ', width = 15) self.rhocolumn = Label(self.tframe, text =' ', width = 15) self.foccolumn = Label(self.tframe, text =' ', width = 20) self.endcolumn = Label(self.tframe, text =' ', width = 2) self.namelabel = Label(self.tframe, text = 'Matrix') self.elabel = Label(self.tframe, text = 'Porosity') self.rholabel = Label(self.tframe, text = 'Bulk density' ) self.foclabel = Label(self.tframe, text = 'Organic carbon fraction') self.rhounit = Label(self.tframe, text = u'g/cm\u00B3') self.botblankcolumn = Label(self.frame, text ='', width = 1) self.boteditcolumn = Label(self.frame, text =' ', width = 6) self.botdelcolumn = Label(self.frame, text =' ', width = 6) self.botnamecolumn = Label(self.frame, text =' ', width = 20) self.botecolumn = Label(self.frame, text =' ', width = 15) self.botrhocolumn = Label(self.frame, text =' ', width = 15) self.botfoccolumn = Label(self.frame, text =' ', width = 20) self.botendcolumn = Label(self.frame, text =' ', width = 2) self.blank1 = Label(self.bframe, text = ' ') self.blank2 = Label(self.bframe, text = ' ') self.blank3 = Label(self.bframe, text = ' ') self.addwidget = Button(self.bframe, text = 'Add materials', command = self.addmatrix, width = 20) self.loadwidget = Button(self.bframe, text = 'Load materials', command = self.loadmatrix, width = 20) self.mixwidget = Button(self.bframe, text = 'Create mixtures', command = self.addmixture, width = 20) #show the widgets on the grid self.instructions.grid( row = 0, column = 0, sticky = 'W', padx = 8, columnspan = 6,) self.blankcolumn.grid( row = 1, column = 0, sticky = 'WE', padx = 1, pady = 1) self.editcolumn.grid( row = 1, column = 1, sticky = 'WE', padx = 1, pady = 1) self.delcolumn.grid( row = 1, column = 2, sticky = 'WE', padx = 1, pady = 1) self.namecolumn.grid( row = 1, column = 3, sticky = 'WE', padx = 1, pady = 1) self.ecolumn.grid( row = 1, column = 4, sticky = 'WE', padx = 1, pady = 1) self.rhocolumn.grid( row = 1, column = 5, sticky = 'WE', padx = 1, pady = 1) self.foccolumn.grid( row = 1, column = 6, sticky = 'WE', padx = 1, pady = 1) self.namelabel.grid( row = 2, column = 3, sticky = 'WE', padx = 1, pady = 1) self.elabel.grid ( row = 2, column = 4, sticky = 'WE', padx = 1, pady = 1) self.rholabel.grid ( row = 2, column = 5, sticky = 'WE', padx = 1, pady = 1) self.foclabel.grid ( row = 2, column = 6, sticky = 'WE', padx = 1, pady = 1) self.rhounit.grid ( row = 3, column = 5, sticky = 'WE', padx = 1, pady = 1) self.updatematrices() def updatematrices(self): self.addwidget.grid_forget() self.loadwidget.grid_forget() self.blank1.grid_forget() self.botblankcolumn.grid_forget() self.boteditcolumn.grid_forget() self.botdelcolumn.grid_forget() self.botnamecolumn.grid_forget() self.botecolumn.grid_forget() self.botrhocolumn.grid_forget() self.botfoccolumn.grid_forget() material_list = self.materials.keys() for matrix in self.matrices: if len(matrix.components) == 1 : try: material_list.remove(matrix.name) except: pass row = 4 for matrix in self.matrices: try: matrix.remove_propertieswidgets() except:pass matrix.number = self.matrices.index(matrix) + 1 matrix.propertieswidgets(self.frame, row, self.master) row = row + 1 self.botblankcolumn.grid( row = row, column = 0, sticky = 'WE', padx = 1, pady = 1) self.boteditcolumn.grid( row = row, column = 1, sticky = 'WE', padx = 1, pady = 1) self.botdelcolumn.grid( row = row, column = 2, sticky = 'WE', padx = 1, pady = 1) self.botnamecolumn.grid( row = row, column = 3, sticky = 'WE', padx = 1, pady = 1) self.botecolumn.grid( row = row, column = 4, sticky = 'WE', padx = 1, pady = 1) self.botrhocolumn.grid( row = row, column = 5, sticky = 'WE', padx = 1, pady = 1) self.botfoccolumn.grid( row = row, column = 6, sticky = 'WE', padx = 1, pady = 1) row = 0 self.blank1.grid(row = row) row = row + 1 self.blank2.grid(row = row) row = row + 1 self.addwidget.grid(row = row, columnspan = 11) row = row + 1 if len(material_list) > 0: self.loadwidget.grid(row = row, columnspan = 11) row = row + 1 self.mixwidget.grid(row = row, columnspan = 11) row = row + 1 self.addwidget.bind('<Return>', self.addmatrix) self.mixwidget.bind('<Return>', self.addmixture) if self.nmatrices == 0: self.focusbutton = self.addwidget else: self.focusbutton = None self.master.geometry() self.master.center() def addmixture(self, default = None): self.nmatrices = self.nmatrices + 1 self.matrices.append(Matrix(self.nmatrices)) if self.top is None: self.top = CapSimWindow(master = self.master, buttons = 2) self.top.make_window(MixtureEditor(self.top, self.system, self.matrices[-1], self.matrices, self.materials, editflag = 0)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.matrices[-1].get_matrix(self.top.window) else: self.matrices.remove(self.matrices[-1]) self.nmatrices = self.nmatrices - 1 for component in self.matrices[-1].components: for matrix in self.matrices[:-1]: for sub_component in matrix.components: if sub_component.name == component.name: sub_component.e = component.e sub_component.rho = component.rho sub_component.foc = component.foc if len(matrix.components) > 1: e = 0 rho = 0 moc = 0 foc = 0 fractions = 0 for component in matrix.components: fractions = fractions + component.fraction e = e + component.fraction * component.e rho = rho + component.fraction * component.rho moc = moc + component.fraction * component.rho * component.foc foc = moc/rho matrix.e = (round(e,2)) matrix.rho = (round(rho,3)) matrix.foc = (round(foc,3)) else: matrix.e = matrix.components[-1].e matrix.rho = matrix.components[-1].rho matrix.foc = matrix.components[-1].foc if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror(title = self.system.version, message = 'Please close the existing parameter input window first.') self.top.tk.focus() self.updatematrices() def addmatrix(self, default = None): self.nmatrices = self.nmatrices + 1 self.matrices.append(Matrix(self.nmatrices)) if self.top is None: self.top = CapSimWindow(master = self.master, buttons = 2) self.top.make_window(MatrixEditor(self.top, self.system, self.matrices[-1], self.matrices, self.materials, editflag = 0, newflag = 1)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.matrices[-1].get_matrix(self.top.window) else: self.matrices.remove(self.matrices[-1]) self.nmatrices = self.nmatrices - 1 if len(self.matrices) > 0: for component in self.matrices[-1].components: for matrix in self.matrices[:-1]: for sub_component in matrix.components: if sub_component.name == component.name: sub_component.e = component.e sub_component.rho = component.rho sub_component.foc = component.foc if len(matrix.components) > 1: e = 0 rho = 0 moc = 0 foc = 0 fractions = 0 for component in matrix.components: fractions = fractions + component.fraction e = e + component.fraction * component.e rho = rho + component.fraction * component.rho moc = moc + component.fraction * component.rho * component.foc foc = moc/rho matrix.e = (round(e,2)) matrix.rho = (round(rho,3)) matrix.foc = (round(foc,3)) else: matrix.e = matrix.components[-1].e matrix.rho = matrix.components[-1].rho matrix.foc = matrix.components[-1].foc if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror(title = self.system.version, message = 'Please close the existing parameter input window first.') self.top.tk.focus() self.updatematrices() def loadmatrix(self, default = None): self.nmatrices = self.nmatrices + 1 self.matrices.append(Matrix(self.nmatrices)) if self.top is None: self.top = CapSimWindow(master = self.master, buttons = 2) self.top.make_window(MatrixEditor(self.top, self.system, self.matrices[-1], self.matrices, self.materials, editflag = 0, newflag = 0)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.matrices[-1].get_matrix(self.top.window) else: self.matrices.remove(self.matrices[-1]) self.nmatrices = self.nmatrices - 1 if len(self.matrices) > 0: for component in self.matrices[-1].components: for matrix in self.matrices[:-1]: for sub_component in matrix.components: if sub_component.name == component.name: sub_component.e = component.e sub_component.rho = component.rho sub_component.foc = component.foc if len(matrix.components) > 1: e = 0 rho = 0 moc = 0 foc = 0 fractions = 0 for component in matrix.components: fractions = fractions + component.fraction e = e + component.fraction * component.e rho = rho + component.fraction * component.rho moc = moc + component.fraction * component.rho * component.foc foc = moc/rho matrix.e = (round(e,2)) matrix.rho = (round(rho,3)) matrix.foc = (round(foc,3)) else: matrix.e = matrix.components[-1].e matrix.rho = matrix.components[-1].rho matrix.foc = matrix.components[-1].foc if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror(title = self.system.version, message = 'Please close the existing parameter input window first.') self.top.tk.focus() self.updatematrices() def editmatrix(self, number): if self.top is None: self.top = CapSimWindow(master = self.master, buttons = 2) if len(self.matrices[number - 1].components) < 2: self.top.make_window(MatrixEditor(self.top, self.system, self.matrices[number-1], self.matrices, self.materials, editflag = 1, newflag = 0)) else: self.top.make_window(MixtureEditor(self.top, self.system,self.matrices[number-1], self.matrices, self.materials, editflag = 1)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.matrices[number-1].get_matrix(self.top.window) if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror(title = self.system.version, message = 'Please close the existing parameter input window first.') self.top.tk.focus() self.updatematrices() def deletematrix(self, number): if self.top is None: self.top = CapSimWindow(master = self.master, buttons = 2) self.top.make_window(MatrixDeleter(self.top, self.system, self.matrices[number-1])) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.matrices[number-1].remove_propertieswidgets() self.matrices.remove(self.matrices[number-1]) self.nmatrices = self.nmatrices - 1 if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror(title = self.system.version, message = 'Please close the existing parameter input window first.') self.top.tk.focus() self.updatematrices() def error_check(self): error = 0 if self.nmatrices == 0: error = 1 return error def warning(self): tkmb.showerror(title = self.version, message = 'No matrices has been selected, please add matrices by pressing the button "Add materials" or the button "Add mixture"') self.focusbutton = None self.master.tk.lift()
class Game: def __init__(self): self.root = Tk() self.frame1 = None self.frame2 = None self.w = None self.scoreC = None self.score = 0 self.hor = True self.upid = self.downid = self.rightid = self.leftid = 0 self.head = -1 self.time = 700 def home(self): self.frame1 = Frame(self.root, width=750, height=350, padx=250, bg="black") self.frame2 = Frame(self.root, height=250, width=750, bg="black", padx=25) self.root.wm_minsize(width=750, height=666) self.root.configure(bg="black") self.frame1.pack_propagate(0) self.frame1.update() self.frame1.configure(pady=self.frame1.cget("height") / 2.5) logo = PhotoImage(file="logo.gif") starth = Button(self.frame1, text="Hard", bg="orange", padx=25, pady=5, font=Font(family="comic sans MS", size=10), command=lambda: self.callgame(40)) startm = Button(self.frame1, text="Medium", bg="teal", padx=25, pady=5, font=Font(family="comic sans MS", size=10), command=lambda: self.callgame(60)) starte = Button(self.frame1, text="Easy", bg="orange", padx=25, pady=5, font=Font(family="comic sans MS", size=10), command=lambda: self.callgame(75)) self.frame2.pack_propagate(0) exp = """ This is a game in which the arrow keys are used to move the snake around and to get points""" exf = Font(family="comic sans MS", size=20) Label(self.frame2, image=logo, bg="black", text=exp, padx=10).pack(side="right") Label(self.frame2, fg="white", bg="black", text=exp, justify="left", font=exf).pack(side="left") starte.grid(row=0, columnspan=2) startm.grid(row=0, columnspan=2, column=4, padx=18) starth.grid(row=0, columnspan=2, column=8) head = Font(family="comic sans MS", size=30) self.H = Label(self.root, text="SNAKES", font=head, fg="orange", bg="black", pady=10) self.H.pack() self.frame2.pack(expand=True) self.frame1.pack(expand=True) self.root.mainloop() def callgame(self, time): self.time = time self.game() def do_after_cancel(self, a, b): if a != 0: self.w.after_cancel(a) if b != 0: self.w.after_cancel(b) def calldown(self, key): if self.hor: self.do_after_cancel(self.leftid, self.rightid) self.down(0) def callup(self, key): if self.hor: self.do_after_cancel(self.leftid, self.rightid) self.up(0) def callright(self, key): if not self.hor: self.do_after_cancel(self.upid, self.downid) self.right(0) def callleft(self, key): if not self.hor: self.do_after_cancel(self.upid, self.downid) self.left(0) def game(self): self.score = 0 self.w = Canvas(self.root, width=750, height=500, relief="flat", highlightbackground="grey", highlightthickness=10) self.frame1.destroy() self.frame2.destroy() self.root.configure(width=1000, padx=10) self.root.pack_propagate(0) self.w.configure(background="black") self.w.pack(side="left") self.w.create_line(300, 250, 450, 250, width=10, fill="teal") self.scoreC = Label(self.root, text="Score\n" + str(self.score), bg="black", fg="teal", padx=25, pady=35, font=Font(family="comic sans MS", size=25)) self.head = self.w.create_line(450, 250, 455, 250, width=10, fill="white") self.scoreC.pack(side="top") self.root.bind("<Up>", self.callup) self.root.bind("<Down>", self.calldown) self.root.bind("<Right>", self.callright) self.root.bind("<Left>", self.callleft) self.createFood() self.right(0) def down(self, i): crd = self.w.coords(1) if len(crd) > 0: if crd[0] == crd[2]: if crd[1] > crd[3]: # print("inside if1") crd[1] -= 10 if crd[1] < crd[3]: # print("inside if2") crd[1] += 10 else: if crd[0] > crd[2]: crd[0] -= 10 if crd[0] < crd[2]: crd[0] += 10 crd[-1] += 10 if i == 0: crd.append(crd[-2]) crd.append(crd[-2]) crd[-3] -= 10 if crd[0] == crd[2] and crd[1] == crd[3]: crd = crd[2:] self.w.coords(1, *crd) self.w.delete(self.head) self.head = self.w.create_line(crd[-2], crd[-1], crd[-2], crd[-1] + 5, width=10, fill="orange") end = self.end() self.checkEaten() i += 1 self.hor = False if not end: self.downid = self.w.after(self.time, self.down, i) else: self.w.delete(1) self.w.delete(self.head) self.w.delete(self.food) self.start = Button(self.root, text="Start", bg="orange", padx=25, pady=25, font=Font(family="comic sans MS", size=15), command=lambda: self.callhome()) self.start.pack(side="bottom") def up(self, i): crd = self.w.coords(1) if len(crd) > 0: if crd[0] == crd[2]: if crd[1] > crd[3]: # print("inside if1") crd[1] -= 10 if crd[1] < crd[3]: # print("inside if2") crd[1] += 10 else: if crd[0] > crd[2]: crd[0] -= 10 if crd[0] < crd[2]: crd[0] += 10 crd[-1] -= 10 if i == 0: crd.append(crd[-2]) crd.append(crd[-2]) crd[-3] += 10 if crd[0] == crd[2] and crd[1] == crd[3]: crd = crd[2:] self.w.coords(1, *crd) self.w.delete(self.head) self.head = self.w.create_line(crd[-2], crd[-1], crd[-2], crd[-1] - 5, width=10, fill="orange") end = self.end() self.checkEaten() i += 1 self.hor = False if not end: self.upid = self.w.after(self.time, self.up, i) else: self.w.delete(1) self.w.delete(self.head) self.w.delete(self.food) self.start = Button(self.root, text="Start", bg="orange", padx=25, pady=25, font=Font(family="comic sans MS", size=15), command=lambda: self.callhome()) self.start.pack(side="bottom") def right(self, i): crd = self.w.coords(1) if len(crd) > 0: if crd[0] == crd[2]: if crd[1] > crd[3]: # print("inside if1") crd[1] -= 10 if crd[1] < crd[3]: # print("inside if2") crd[1] += 10 else: if crd[0] > crd[2]: crd[0] -= 10 if crd[0] < crd[2]: crd[0] += 10 crd[-2] += 10 if i == 0: crd.append(crd[-2]) crd.append(crd[-2]) crd[-4] -= 10 if crd[0] == crd[2] and crd[1] == crd[3]: crd = crd[2:] self.w.coords(1, *crd) self.w.delete(self.head) self.head = self.w.create_line(crd[-2], crd[-1], crd[-2] + 5, crd[-1], width=10, fill="orange") end = self.end() self.checkEaten() i += 1 self.hor = True if not end: self.rightid = self.w.after(self.time, self.right, i) else: self.w.delete(1) self.w.delete(self.head) self.w.delete(self.food) self.start = Button(self.root, text="Start", bg="orange", padx=25, pady=25, font=Font(family="comic sans MS", size=15), command=lambda: self.callhome()) self.start.pack(side="bottom") def left(self, i): crd = self.w.coords(1) if len(crd) > 0: if crd[0] == crd[2]: if crd[1] > crd[3]: # print("inside if1") crd[1] -= 10 if crd[1] < crd[3]: # print("inside if2") crd[1] += 10 else: if crd[0] > crd[2]: crd[0] -= 10 if crd[0] < crd[2]: crd[0] += 10 crd[-2] -= 10 if i == 0: crd.append(crd[-2]) crd.append(crd[-2]) crd[-4] += 10 if crd[0] == crd[2] and crd[1] == crd[3]: crd = crd[2:] self.w.coords(1, *crd) self.w.delete(self.head) self.head = self.w.create_line(crd[-2], crd[-1], crd[-2] - 5, crd[-1], width=10, fill="orange") end = self.end() self.checkEaten() i += 1 self.hor = True if not end: self.leftid = self.w.after(self.time, self.left, i) else: self.w.delete(1) self.w.delete(self.head) self.w.delete(self.food) self.start = Button(self.root, text="Start", bg="orange", padx=25, pady=25, font=Font(family="comic sans MS", size=15), command=lambda: self.callhome()) self.start.pack(side="bottom") def createFood(self): # self.w.delete(self.food) #deleting old food. crd = self.w.coords(1) ext = [] for i in crd: ext.append(i) for j in range(-50, 50): ext.append(i + j) randx = random.randrange(20, 730) randy = random.randrange(20, 480) while randx not in ext and randy not in ext: randx = random.randrange(20, 730) randy = random.randrange(20, 480) self.food = self.w.create_line(randx, randy, randx + 12, randy, width=10, fill="yellow") def checkEaten(self): headcoords = self.w.coords(self.head) foodcoords = self.w.coords(self.food) # self.w.delete(self.food) flag = False # print(headcoords[-4]) # print(foodcoords[-4]) # print(foodcoords[-2]) if int(headcoords[-4]) in range( int(foodcoords[-4]) - 7, int(foodcoords[-2]) + 7) and int(headcoords[-3]) in range( int(foodcoords[-1]) - 10, int(foodcoords[-1] + 10)): flag = True if flag: self.grow() self.score += 10 self.scoreC.configure(text="Score\n" + str(self.score), bg="black", fg="teal", padx=25, pady=35, font=Font(family="comic sans MS", size=25)) self.w.delete(self.food) self.createFood() def grow(self): crd = self.w.coords(1) if crd[0] != crd[2]: # horizontal condition if crd[0] < crd[2]: crd[0] -= 20 else: crd[0] += 20 self.w.coords(1, *crd) else: if crd[3] < crd[1]: crd[1] += 20 else: crd[1] -= 20 self.w.coords(1, *crd) def end(self): crd = self.w.coords(1) h = self.w.coords(self.head) a = 0 while a < len(crd) - 2: if crd[a] == crd[a + 2]: if (h[0] == crd[a] and crd[a + 1] < h[1] < crd[a + 3]) or ( h[0] == crd[a] and crd[a + 1] > h[1] > crd[a + 3]): return True else: if (h[1] == crd[a + 1] and crd[a] < h[0] < crd[a + 2]) or ( h[1] == crd[a + 1] and crd[a] > h[0] > crd[a + 2]): return True a += 2 if (h[0] == 0 and 0 < h[1] < 500) or (h[1] == 0 and 0 < h[0] < 750) or ( h[1] == 510 and 0 < h[0] < 750) or (h[0] == 760 and 0 < h[1] < 500): return True return False def callhome(self): self.w.destroy() self.start.destroy() self.H.destroy() self.scoreC.destroy() self.home()
class MatrixDeleter: def __init__(self, master, system, matrix): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) #superscript font self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.top = None #flag for existence of toplevel# self.matrix = matrix self.name = StringVar(value=matrix.name) #stores the chemical name self.model = StringVar(value=matrix.model) #stores the chemical name self.e = DoubleVar(value=matrix.e) #stores the porosity self.rho = DoubleVar(value=matrix.rho) #stores the bulk density self.foc = DoubleVar( value=matrix.foc) #stores the organic carbon fraction self.cancelflag = 0 def make_widgets(self): self.bgcolor = self.frame.cget('bg') self.instructions = Label( self.frame, text=' Are you sure to delete the following matrix? ') self.namelabel = Label(self.frame, text='Material') self.elabel = Label(self.frame, text='Porosity') self.rholabel = Label(self.frame, text='Bulk density (' + u'g/cm\u00B3' + ')') self.foclabel = Label(self.frame, text='Organic carbon\n fraction') self.namewidget = Label(self.frame, width=16, justify='center', textvariable=self.name) self.ewidget = Label(self.frame, width=16, justify='center', textvariable=self.e) self.rhowidget = Label(self.frame, width=16, justify='center', textvariable=self.rho) self.focwidget = Label(self.frame, width=16, justify='center', textvariable=self.foc) self.blankcolumn = Label(self.frame, text=' ', width=1) self.namecolumn = Label(self.frame, text=' ', width=20) self.ecolumn = Label(self.frame, text=' ', width=14) self.rhocolumn = Label(self.frame, text=' ', width=15) self.foccolumn = Label(self.frame, text=' ', width=15) self.deletebutton = Button(self.frame, text='Delete', width=20, command=self.Delete) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.Cancel) self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') #show the widgets on the grid self.instructions.grid(row=0, column=0, columnspan=6, padx=8, sticky='W') self.blankcolumn.grid(row=1, column=0, sticky='WE', padx=1, pady=1) self.namecolumn.grid(row=1, column=1, sticky='WE', padx=1, pady=1) self.ecolumn.grid(row=1, column=2, sticky='WE', padx=1, pady=1) self.rhocolumn.grid(row=1, column=3, sticky='WE', padx=1, pady=1) self.foccolumn.grid(row=1, column=4, sticky='WE', padx=1, pady=1) self.namelabel.grid(row=2, column=1, sticky='WE', padx=4, pady=1) self.elabel.grid(row=2, column=2, sticky='WE', padx=1, pady=1) self.rholabel.grid(row=2, column=3, sticky='WE', padx=1, pady=1) self.foclabel.grid(row=2, column=4, sticky='WE', padx=1, pady=1) self.namewidget.grid(row=4, column=1, padx=2, pady=1, sticky='WE') self.ewidget.grid(row=4, column=2, padx=2, pady=1) self.rhowidget.grid(row=4, column=3, padx=2, pady=1) self.focwidget.grid(row=4, column=4, padx=2, pady=1) self.blank1.grid(row=5) self.deletebutton.grid(row=6, columnspan=11) self.cancelbutton.grid(row=7, columnspan=11) self.blank2.grid(row=8) self.deletebutton.bind('<Return>', self.Delete) self.focusbutton = self.deletebutton def Delete(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit() def Cancel(self): try: self.name.set(self.matrix.name) self.model.set(self.matrix.model) self.e.set(self.matrix.e) self.rho.set(self.matrix.rho) self.foc.set(self.matrix.foc) self.components = self.matrix.components except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class MatrixEditor: """Gets the contaminant properties.""" def __init__(self, master, system, matrix, matrices, materials, editflag, newflag): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) #superscript font self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.top = None #flag for existence of toplevel# self.matrix = matrix self.matrices = matrices self.materials = materials self.matrices_list = self.materials.keys() self.matrices_list.sort() for matrix in (self.matrices): if matrix.number <> self.matrix.number and len( matrix.components) == 1 and self.matrices_list.count( matrix.name) > 0: self.matrices_list.remove(matrix.name) self.model = StringVar( value='Linear') #Define the imaginary model for the components self.name = StringVar(value=self.matrices_list[0]) #matrix name self.e = DoubleVar(value=0.5) #stores the porosity self.rho = DoubleVar(value=1.0) #stores the bulk density self.foc = DoubleVar(value=0.01) #stores the organic carbon fraction self.editflag = editflag self.newflag = newflag self.cancelflag = 0 if editflag == 0: self.components = [MatrixComponent(1)] #Define components if editflag == 1: #Detemine whether the chemical is added or edited self.components = self.matrix.components self.name.set(self.matrix.name) self.model.set(self.matrix.model) self.e.set(self.matrix.e) self.rho.set(self.matrix.rho) self.foc.set(self.matrix.foc) def make_widgets(self): """Make the widgets for the window.""" self.bgcolor = self.frame.cget('bg') self.instructions = Label( self.frame, text= ' Please provide the following properties for the matrix: ' ) self.blankcolumn = Label(self.frame, text=' ', width=1) self.namecolumn = Label(self.frame, text=' ', width=20) self.ecolumn = Label(self.frame, text=' ', width=14) self.rhocolumn = Label(self.frame, text=' ', width=15) self.foccolumn = Label(self.frame, text=' ', width=15) self.namelabel = Label(self.frame, text='Material') self.elabel = Label(self.frame, text='Porosity') self.rholabel = Label(self.frame, text='Bulk density (' + u'g/cm\u00B3' + ')') self.foclabel = Label(self.frame, text='Organic carbon fraction') if self.editflag == 1: self.namewidget = Label(self.frame, width=16, justify='center', textvariable=self.name) else: if self.newflag == 0: self.namewidget = OptionMenu(self.frame, self.name, *self.matrices_list, command=self.click_matrix) else: self.name.set('Matrix') self.namewidget = Entry(self.frame, width=16, justify='center', textvariable=self.name) self.ewidget = Entry(self.frame, width=10, justify='center', textvariable=self.e) self.rhowidget = Entry(self.frame, width=10, justify='center', textvariable=self.rho) self.focwidget = Entry(self.frame, width=10, justify='center', textvariable=self.foc) self.okbutton = Button(self.frame, text='OK', width=20, command=self.OK) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.Cancel) self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') #show the widgets on the grid self.instructions.grid(row=0, column=0, columnspan=7, padx=8, sticky='W') self.blankcolumn.grid(row=1, column=0, sticky='WE', padx=1, pady=1) self.namecolumn.grid(row=1, column=1, sticky='WE', padx=1, pady=1) self.ecolumn.grid(row=1, column=2, sticky='WE', padx=1, pady=1) self.rhocolumn.grid(row=1, column=3, sticky='WE', padx=1, pady=1) self.foccolumn.grid(row=1, column=4, sticky='WE', padx=1, pady=1) self.namelabel.grid(row=2, column=1, sticky='WE', padx=4, pady=1) self.elabel.grid(row=2, column=2, sticky='WE', padx=1, pady=1) self.rholabel.grid(row=2, column=3, sticky='WE', padx=1, pady=1) self.foclabel.grid(row=2, column=4, sticky='WE', padx=1, pady=1) if self.newflag == 0: self.namewidget.grid(row=4, column=1, sticky='WE', padx=6, pady=1) else: self.namewidget.grid(row=4, column=1, padx=6, pady=1) self.ewidget.grid(row=4, column=2, padx=6, pady=1) self.rhowidget.grid(row=4, column=3, padx=6, pady=1) self.focwidget.grid(row=4, column=4, padx=6, pady=1) self.blank1.grid(row=5) self.okbutton.grid(row=6, columnspan=11) self.cancelbutton.grid(row=7, columnspan=11) self.blank2.grid(row=8) self.okbutton.bind('<Return>', self.OK) self.focusbutton = self.okbutton if self.editflag == 0 and self.newflag == 0: self.click_matrix() def click_matrix(self, event=None): """Pulls up the contaminant properties from the database after selecting a compound.""" self.tort = self.materials[self.name.get()].tort self.sorp = self.materials[self.name.get()].sorp self.e.set(self.materials[self.name.get()].e) self.rho.set(self.materials[self.name.get()].rho) self.foc.set(self.materials[self.name.get()].foc) self.frame.update() self.master.geometry() self.master.center() def OK(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.editflag == 0: check = [(matrix.name == self.name.get()) for matrix in self.matrices[0:-1]] if self.editflag == 1: check = [0] if self.master.window.top is not None: self.master.open_toplevel() elif self.e.get() > 1 or self.e.get() < 0: tkmb.showinfo( self.version, 'The porosity of a solid can not be larger than 1 or smaller than 0' ) self.e.set(0.5) elif self.rho.get() < 0: tkmb.showinfo(self.version, 'The bulk density of a solid can not be negative') self.e.set(1.0) elif self.foc.get() > 1 or self.foc.get() < 0: tkmb.showinfo( self.version, 'The organic carbon fraction of a solid can not be larger than 1 or smaller than 0' ) self.e.set(1.0) elif sum(check) >= 1 or self.name.get() == '': self.matrix_error() else: self.components[0].name = self.name.get() self.components[0].mfraction = 1. self.components[0].fraction = 1. self.components[0].e = self.e.get() self.components[0].rho = self.rho.get() self.components[0].foc = self.foc.get() if self.editflag == 0: if self.newflag == 0: self.components[0].tort = self.materials[ self.name.get()].tort self.components[0].sorp = self.materials[ self.name.get()].sorp else: self.components[0].tort = 'Millington & Quirk' self.components[0].sorp = 'Linear--Kd specified' self.master.tk.quit() def matrix_error(self): tkmb.showerror( title=self.version, message= 'This solid material has already been added to the database!') self.focusbutton = self.okbutton self.master.tk.lift() def Cancel(self): try: self.name.set(self.matrix.name) self.model.set(self.matrix.model) self.e.set(self.matrix.e) self.rho.set(self.matrix.rho) self.foc.set(self.matrix.foc) self.components = self.matrix.components except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class EvapEditor: """Used to make a window to compute the value of "kbl" for Rivers.""" def __init__(self, master, version, fonttype, timeunit, lengthunit, chemicals, kevaps): """Constructor method.""" self.version = version self.fonttype = fonttype self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.superfont = get_superfont(self.fonttype) self.cancelflag = 0 self.timeunit = timeunit self.lengthunit = lengthunit self.chemicals = chemicals self.kevaps = [] for n in range(len(self.chemicals)): self.kevaps.append(DoubleVar(value=kevaps[n])) def make_widgets(self): """Makes the widgets for the window.""" self.bgcolor = self.frame.cget('bg') self.text = Label( self.frame, text='Provide the evapration rate coefficient for the water column:' ) self.blank1 = Label(self.frame, text='') self.blank2 = Label(self.frame, text='') self.blank3 = Label(self.frame, text='') self.blank4 = Label(self.frame, text='') self.klabel = Label(self.frame, width=25, text='Evaporation rate coefficient (' + self.lengthunit + '/' + self.timeunit + ')') self.text.grid(row=0, columnspan=11, padx=8, sticky='W') self.blank1.grid(row=1) self.klabel.grid(row=3, column=0, padx=8, sticky='E') self.chemicallabels = [] self.chemicalentrys = [] column = 3 for n in range(len(self.chemicals)): self.chemicallabels.append( Label(self.frame, text=self.chemicals[n].name, justify='center')) self.chemicalentrys.append( Entry(self.frame, textvariable=self.kevaps[n], justify='center', width=8)) self.chemicallabels[-1].grid(row=2, column=column, padx=4, pady=1, sticky='WE') self.chemicalentrys[-1].grid(row=3, column=column, padx=4, pady=1) column = column + 1 self.blank3.grid(row=3, column=column) self.okbutton = Button(self.frame, text='OK', width=20, command=self.OK) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.cancel) self.okbutton.bind('<Return>', self.OK) self.cancelbutton.bind('<Return>', self.cancel) self.blank2.grid(row=4) self.okbutton.grid(row=5, columnspan=len(self.chemicals) + 5, pady=1) self.cancelbutton.grid(row=6, columnspan=len(self.chemicals) + 5, pady=1) self.focusbutton = self.okbutton def OK(self, event=None): """Finish and move on.""" self.frame.quit() def cancel(self, event=None): """Used to close the window without computing kbl.""" self.cancelflag = 1 self.frame.quit()
class TauEstimator: """Used to make a window to compute the value of "kbl" for Rivers.""" def __init__(self, master, version, fonttype, timeunit, lengthunit, chemicals, taucoefs, BCs): """Constructor method.""" self.master = master self.version = version self.fonttype = fonttype self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.superfont = get_superfont(self.fonttype) self.Decays = ['None', 'First order'] self.Evaps = ['None', 'First order'] self.top = None self.cancelflag = 0 self.timeunit = timeunit self.lengthunit = lengthunit self.Q = DoubleVar(value=taucoefs['Q']) self.V = DoubleVar(value=taucoefs['V']) self.h = DoubleVar(value=taucoefs['h']) self.Qevap = DoubleVar(value=taucoefs['Qevap']) self.doc = DoubleVar(value=taucoefs['DOC']) self.Decay = StringVar(value=taucoefs['Decay']) self.Evap = StringVar(value=taucoefs['Evap']) self.chemicals = chemicals self.kdecays = [] self.kevaps = [] for chemical in self.chemicals: self.kdecays.append(BCs[chemical.name].kdecay) self.kevaps.append(BCs[chemical.name].kevap) def make_widgets(self): """Makes the widgets for the window.""" self.bgcolor = self.frame.cget('bg') self.text = Label( self.frame, text= 'Please provide the information to estimate the retention time of the overlying water body:' ) self.blank1 = Label(self.frame, text='') self.blank2 = Label(self.frame, text='') self.blank3 = Label(self.frame, text='') self.blank4 = Label(self.frame, text='') self.leftcolumn = Label(self.frame, text=' ', width=15) self.paracolumn = Label(self.frame, text=' ', width=10) self.valuecolumn = Label(self.frame, text=' ', width=15) self.unitcolumn = Label(self.frame, text=' ', width=10) self.rightcolumn = Label(self.frame, text=' ', width=10) self.paralabel = Label(self.frame, text='Parameters') self.valuelabel = Label(self.frame, text='Values') self.unitlabel = Label(self.frame, text='Units') self.qlabel = Label(self.frame, text='Inflow rate:') self.qentry = Entry(self.frame, textvariable=self.Q, width=10, justify='center') self.qunits = Label(self.frame, text='m' + u'\u00B3/' + self.timeunit) self.Vlabel = Label(self.frame, text='Water body volume:') self.Ventry = Entry(self.frame, textvariable=self.V, width=10, justify='center') self.Vunits = Label(self.frame, text='m' + u'\u00B3') self.hlabel = Label(self.frame, text='Water body depth:') self.hentry = Entry(self.frame, justify='center', width=10, textvariable=self.h) self.hunits = Label(self.frame, text='m') self.qevaplabel = Label(self.frame, text='Water evaporation rate:') self.qevapentry = Entry(self.frame, textvariable=self.Qevap, width=10, justify='center') self.qevapunits = Label(self.frame, text='m' + u'\u00B3/' + self.timeunit) self.doclabel = Label(self.frame, text='Water body DOC concentration:') self.docentry = Entry(self.frame, textvariable=self.doc, width=10, justify='center') self.docunits = Label(self.frame, text='mg/L') self.Decaylabel = Label(self.frame, text='Contaminant decay:') self.Decaywidget = OptionMenu(self.frame, self.Decay, *self.Decays, command=self.editdecay) self.Evaplabel = Label(self.frame, text='Contaminant evaporation:') self.Evapwidget = OptionMenu(self.frame, self.Evap, *self.Evaps, command=self.editevap) self.calcbutton = Button(self.frame, text='Calculate', width=20, command=self.calculate) self.exitbutton = Button(self.frame, text='Cancel', width=20, command=self.exit) self.calcbutton.bind('<Return>', self.calculate) self.exitbutton.bind('<Return>', self.exit) self.text.grid(row=0, columnspan=6, padx=8) self.paracolumn.grid(row=1, column=1) self.valuecolumn.grid(row=1, column=2) self.unitcolumn.grid(row=1, column=3) self.paralabel.grid(row=2, column=1, sticky='E') self.valuelabel.grid(row=2, column=2) self.unitlabel.grid(row=2, column=3, sticky='W') self.blank1.grid(row=3) self.qlabel.grid(row=4, column=1, sticky='E') self.qentry.grid(row=4, column=2, pady=4) self.qunits.grid(row=4, column=3, sticky='W') self.Vlabel.grid(row=5, column=1, sticky='E', pady=2) self.Ventry.grid(row=5, column=2, pady=4) self.Vunits.grid(row=5, column=3, sticky='W', pady=2) self.hlabel.grid(row=6, column=1, sticky='E', pady=2) self.hentry.grid(row=6, column=2, pady=4) self.hunits.grid(row=6, column=3, sticky='W', pady=2) self.qevaplabel.grid(row=7, column=1, sticky='E', pady=2) self.qevapentry.grid(row=7, column=2, pady=4) self.qevapunits.grid(row=7, column=3, sticky='W', pady=2) self.doclabel.grid(row=8, column=1, sticky='E', pady=2) self.docentry.grid(row=8, column=2, pady=4) self.docunits.grid(row=8, column=3, sticky='W', pady=2) self.Decaylabel.grid(row=9, column=1, sticky='E', pady=2) self.Decaywidget.grid(row=9, column=2, sticky='WE') self.Evaplabel.grid(row=10, column=1, sticky='E', pady=2) self.Evapwidget.grid(row=10, column=2, sticky='WE') self.blank2.grid(row=11) self.calcbutton.grid(row=12, column=0, columnspan=6, pady=1) self.exitbutton.grid(row=13, column=0, columnspan=6, pady=1) self.focusbutton = self.calcbutton def editdecay(self, event=None): if self.Decay.get() == 'First order': if self.top is None: self.top = CapSimWindow(master=self.master, buttons=2) self.top.make_window( DecayEditor(self.top, self.version, self.fonttype, self.timeunit, self.chemicals, self.kdecays)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: for n in range(len(self.chemicals)): if self.chemicals[n].soluable == 1: self.kdecays[n] = self.top.window.kdecays[n].get() if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror( title=self.version, message= 'Please close the existing parameter input window first.') self.top.tk.focus() def editevap(self, event=None): if self.Evap.get() == 'First order': if self.top is None: self.top = CapSimWindow(master=self.master, buttons=2) self.top.make_window( EvapEditor(self.top, self.version, self.fonttype, self.timeunit, self.lengthunit, self.chemicals, self.kevaps)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: for n in range(len(self.chemicals)): if self.chemicals[n].soluable == 1: self.kevaps[n] = self.top.window.kevaps[n].get() if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror( title=self.version, message= 'Please close the existing parameter input window first.') self.top.tk.focus() def calculate(self, event=None): """Finish and move on.""" self.frame.quit() def exit(self, event=None): """Used to close the window without computing kbl.""" self.cancelflag = 1 self.frame.quit()
class KblEstimator: """Used to make a window to compute the value of "kbl" for Rivers.""" def __init__(self, master, version, fonttype, bltype, blcoefs): """Constructor method.""" self.version = version self.fonttype = fonttype self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.superfont = get_superfont(self.fonttype) self.bltypes = ['River', 'Lake'] self.bltype = StringVar(value=bltype) self.top = None self.cancelflag = 0 #Parameters for Mass transfer coefficient in river self.vx = DoubleVar(value=blcoefs['vx']) self.n = DoubleVar(value=blcoefs['n']) self.hriver = DoubleVar(value=blcoefs['hriver']) self.rh = DoubleVar(value=blcoefs['rh']) self.nu = DoubleVar(value=blcoefs['nu']) #Parameters for Mass transfer coefficient in lake self.rhoair = DoubleVar(value=blcoefs['rhoair']) self.rhowater = DoubleVar(value=blcoefs['rhowater']) self.vwind = DoubleVar(value=blcoefs['vwind']) self.hlake = DoubleVar(value=blcoefs['hlake']) self.llake = DoubleVar(value=blcoefs['llake']) def make_widgets(self): """Makes the widgets for the window.""" self.bgcolor = self.frame.cget('bg') self.text = Label( self.frame, text= 'Please provide the following information regarding the benthic boundary layer:' ) self.blank1 = Label(self.frame, text='') self.blank2 = Label(self.frame, text='') self.blank3 = Label(self.frame, text='') self.blank4 = Label(self.frame, text='') self.paracolumn = Label(self.frame, text=' ', width=20) self.valuecolumn = Label(self.frame, text=' ', width=10) self.unitcolumn = Label(self.frame, text=' ', width=10) self.paralabel = Label(self.frame, text='Parameters') self.valuelabel = Label(self.frame, text='Values') self.unitlabel = Label(self.frame, text='Units') self.bllabel = Label(self.frame, text='Overlying waterbody type') self.blwidget = OptionMenu(self.frame, self.bltype, *self.bltypes, command=self.updateparameters) self.vxlabel = Label(self.frame, text='River velocity:') self.vxentry = Entry(self.frame, textvariable=self.vx, width=8, justify='center') self.vxunits = Label(self.frame, text='m/s') self.nlabel = Label(self.frame, text="Manning's n:") self.nentry = Entry(self.frame, textvariable=self.n, width=8, justify='center') self.nunits = Label(self.frame, text='-') self.hlabel = Label(self.frame, text='River depth:') self.hentry = Entry(self.frame, justify='center', width=8, textvariable=self.hriver) self.hunits = Label(self.frame, text='m') self.rhlabel = Label(self.frame, text='Hydraulic radius:') self.rhentry = Entry(self.frame, textvariable=self.rh, width=8, justify='center') self.rhunits = Label(self.frame, text='m') self.nulabel = Label(self.frame, text='Kinematic viscosity:') self.nuentry = Entry(self.frame, textvariable=self.nu, width=8, justify='center') self.nuunits = Label(self.frame, text=u'm\u00B2/s') self.rhoairlabel = Label(self.frame, text='Density of air:') self.rhoairentry = Entry(self.frame, textvariable=self.rhoair, width=8, justify='center') self.rhoairunits = Label(self.frame, text='g/L') self.rhowaterlabel = Label(self.frame, text='Density of water:') self.rhowaterentry = Entry(self.frame, textvariable=self.rhowater, width=8, justify='center') self.rhowaterunits = Label(self.frame, text='g/L') self.vwindlabel = Label(self.frame, text='Wind speed:') self.vwindentry = Entry(self.frame, textvariable=self.vwind, width=8, justify='center') self.vwindunits = Label(self.frame, text='m/s') self.hlakelabel = Label(self.frame, text='Lake depth:') self.hlakeentry = Entry(self.frame, textvariable=self.hlake, width=8, justify='center') self.hlakeunits = Label(self.frame, text='m') self.lakelabel = Label(self.frame, text='Lake fetch:') self.lakeentry = Entry(self.frame, textvariable=self.llake, width=8, justify='center') self.lakeunits = Label(self.frame, text='m') self.calcbutton = Button(self.frame, text='Calculate', width=20, command=self.calculate) self.exitbutton = Button(self.frame, text='Cancel', width=20, command=self.exit) self.calcbutton.bind('<Return>', self.calculate) self.exitbutton.bind('<Return>', self.exit) self.text.grid(row=0, columnspan=3, padx=8) self.blank1.grid(row=1) self.paracolumn.grid(row=2, column=0, sticky='WE') self.valuecolumn.grid(row=2, column=1, sticky='WE') self.unitcolumn.grid(row=2, column=2, sticky='WE') self.paralabel.grid(row=3, column=0, sticky='E') self.valuelabel.grid(row=3, column=1, sticky='WE') self.unitlabel.grid(row=3, column=2, sticky='W') self.bllabel.grid(row=4, column=0, sticky='E') self.blwidget.grid(row=4, column=1, sticky='WE') self.blank2.grid(row=10) self.calcbutton.grid(row=11, columnspan=3, pady=1) self.exitbutton.grid(row=12, columnspan=3, pady=1) self.focusbutton = self.calcbutton self.updateparameters() def updateparameters(self, event=None): try: self.vxlabel.grid_forget() self.vxentry.grid_forget() self.vxunits.grid_forget() self.nlabel.grid_forget() self.nentry.grid_forget() self.nunits.grid_forget() self.hlabel.grid_forget() self.hentry.grid_forget() self.hunits.grid_forget() self.rhlabel.grid_forget() self.rhentry.grid_forget() self.rhunits.grid_forget() self.nulabel.grid_forget() self.nuentry.grid_forget() self.nuunits.grid_forget() except: pass try: self.rhoairlabel.grid_forget() self.rhoairentry.grid_forget() self.rhoairunits.grid_forget() self.rhowaterlabel.grid_forget() self.rhowaterentry.grid_forget() self.rhowaterunits.grid_forget() self.vwindlabel.grid_forget() self.vwindentry.grid_forget() self.vwindunits.grid_forget() self.hlakelabel.grid_forget() self.hlakeentry.grid_forget() self.hlakeunits.grid_forget() self.lakelabel.grid_forget() self.lakeentry.grid_forget() self.lakeunits.grid_forget() except: pass if self.bltype.get() == self.bltypes[0]: self.vxlabel.grid(row=5, column=0, sticky='E', padx=4) self.vxentry.grid(row=5, column=1) self.vxunits.grid(row=5, column=2, sticky='W') self.nlabel.grid(row=6, column=0, sticky='E', padx=4) self.nentry.grid(row=6, column=1) self.nunits.grid(row=6, column=2, sticky='W') self.hlabel.grid(row=7, column=0, sticky='E', padx=4) self.hentry.grid(row=7, column=1) self.hunits.grid(row=7, column=2, sticky='W') self.rhlabel.grid(row=8, column=0, sticky='E', padx=4) self.rhentry.grid(row=8, column=1) self.rhunits.grid(row=8, column=2, sticky='W') self.nulabel.grid(row=9, column=0, sticky='E', padx=4) self.nuentry.grid(row=9, column=1) self.nuunits.grid(row=9, column=2, sticky='W') else: self.rhoairlabel.grid(row=5, column=0, sticky='E', padx=4) self.rhoairentry.grid(row=5, column=1) self.rhoairunits.grid(row=5, column=2, sticky='W') self.rhowaterlabel.grid(row=6, column=0, sticky='E', padx=4) self.rhowaterentry.grid(row=6, column=1) self.rhowaterunits.grid(row=6, column=2, sticky='W') self.vwindlabel.grid(row=7, column=0, sticky='E', padx=4) self.vwindentry.grid(row=7, column=1) self.vwindunits.grid(row=7, column=2, sticky='W') self.hlakelabel.grid(row=8, column=0, sticky='E', padx=4) self.hlakeentry.grid(row=8, column=1) self.hlakeunits.grid(row=8, column=2, sticky='W') self.lakelabel.grid(row=9, column=0, sticky='E', padx=4) self.lakeentry.grid(row=9, column=1) self.lakeunits.grid(row=9, column=2, sticky='W') def calculate(self, event=None): """Finish and move on.""" self.frame.quit() def exit(self, event=None): """Used to close the window without computing kbl.""" self.cancelflag = 1 self.frame.quit()
class SolidLayerConditions: """Gets the chemical properties for each layer.""" def __init__(self, master, system): """Constructor method. Makes the GUI using the list of "Layer" objects "layers." """ self.master = master self.version = system.version self.fonttype = system.fonttype self.superfont = get_superfont(self.fonttype) self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.lframe = Frame(master.lframe) self.bgcolor = self.frame.cget('bg') self.top = None self.nchemicals = system.nchemicals self.chemicals = system.chemicals self.layers = system.layers self.matrices = system.matrices self.components = system.components self.sorptions = system.sorptions self.concunit = system.concunit self.topline = Label(self.frame, width=10, text='-' * 1000) if system.SolidICs == None: self.SolidICs = {} for layer in system.layers: self.SolidICs[layer.name] = {} for component in system.matrices[layer.type_index].components: self.SolidICs[layer.name][component.name] = {} for chemical in self.chemicals: self.SolidICs[layer.name][component.name][ chemical.name] = SolidIC(layer.name, component.name, chemical.name) else: self.SolidICs = system.SolidICs def make_widgets(self): """Makes the widgets for the GUI.""" self.instructions = Label( self.tframe, text='Please input the initial solid concentrations (' + self.concunit[:-1] + 'kg): ') self.blank1 = Label(self.tframe, text='') self.blank2 = Label(self.tframe, text='') self.blankcolumn = Label(self.tframe, width=2, text=' ') self.layercolumn = Label(self.tframe, width=10, text=' ') self.compcolumn = Label(self.tframe, width=10, text=' ') self.chemcolumn = Label(self.tframe, width=25, text=' ') self.endcolumn = Label(self.tframe, width=4, text=' ') self.layerlabel = Label(self.tframe, width=10, text='Layer') self.complabel = Label(self.tframe, width=10, text='Material') self.chemlabel = Label(self.tframe, width=10, text='Chemical', justify='center') self.botblankcolumn = Label(self.frame, width=2, text=' ') self.botlayercolumn = Label(self.frame, width=10, text=' ') self.botcompcolumn = Label(self.frame, width=10, text=' ') self.botchemcolumn = Label(self.frame, width=25, text=' ') self.botendcolumn = Label(self.frame, width=4, text=' ') self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') self.blank3 = Label(self.frame, text=' ') self.blank4 = Label(self.frame, text=' ') #show the widgets on the grid self.instructions.grid(row=0, column=0, padx=8, columnspan=6, sticky='W') self.blankcolumn.grid(row=1, column=0, sticky='WE', padx=1, pady=1) self.layercolumn.grid(row=1, column=1, sticky='WE', padx=1, pady=1) self.compcolumn.grid(row=1, column=2, sticky='WE', padx=1, pady=1) self.chemcolumn.grid(row=1, column=3, sticky='WE', padx=1, pady=1, columnspan=self.nchemicals) self.endcolumn.grid(row=1, column=3 + self.nchemicals, sticky='WE', padx=1, pady=1) self.layerlabel.grid(row=2, column=1, padx=4, sticky='WE') self.complabel.grid(row=2, column=2, padx=4, sticky='WE') self.chemlabel.grid(row=2, column=3, padx=4, sticky='WE', columnspan=self.nchemicals) self.botblankcolumn.grid(row=0, column=0, sticky='WE', padx=1, pady=1) self.botlayercolumn.grid(row=0, column=1, sticky='WE', padx=1, pady=1) self.botcompcolumn.grid(row=0, column=2, sticky='WE', padx=1, pady=1) self.botchemcolumn.grid(row=0, column=3, sticky='WE', padx=1, pady=1, columnspan=self.nchemicals) self.botendcolumn.grid(row=0, column=3 + self.nchemicals, sticky='WE', padx=1, pady=1) namelabellength = 0 layerlabellength = 0 componentlabellength = 0 column = 3 chemical_flag = [] for chemical in self.chemicals: chemical.ICwidgets(self.frame, column) namelabellength = namelabellength + int( chemical.ICwidget.winfo_reqwidth() / 8 * 1.1424219345) + 1 column = column + 1 self.endcolumn.grid(row=2, column=column, sticky='WE', padx=1, pady=1) if namelabellength > 25: self.chemcolumn.config(width=namelabellength) self.chemcolumn.config(width=namelabellength) row_layer = 4 for layer in self.layers: row = row_layer for component in self.matrices[layer.type_index].components: column = 3 for chemical in self.chemicals: if self.sorptions[component.name][ chemical.name].kinetic == 'Transient': self.SolidICs[layer.name][component.name][ chemical.name].propertieswidgets( self.frame, row, column) else: self.SolidICs[layer.name][component.name][ chemical.name].blankwidgets( self.frame, row, column) column = column + 1 component.SolidICswidgets(self.frame, row) if (int(component.SolidICswidget.winfo_reqwidth() / 8 * 1.1424219345) + 1) > componentlabellength: componentlabellength = int( component.SolidICswidget.winfo_reqwidth() / 8 * 1.1424219345) + 1 row = row + 1 layer.SolidICwidgets(self.frame, row_layer, row, self.nchemicals + 2) if (int(layer.solidlayerlabel.winfo_reqwidth() / 8 * 1.1424219345) + 1) > layerlabellength: layerlabellength = int(layer.solidlayerlabel.winfo_reqwidth() / 8 * 1.1424219345) + 1 row = row + 2 row_layer = row if layerlabellength > 10: self.layercolumn.config(width=layerlabellength) self.botlayercolumn.config(width=layerlabellength) if componentlabellength > 10: self.compcolumn.config(width=componentlabellength) self.botcompcolumn.config(width=componentlabellength) self.topline.grid(row=3, column=1, columnspan=self.nchemicals + 2, sticky='WE', pady=1) self.blank1.grid(row=row) row = row + 1 self.blank2.grid(row=row) self.focusbutton = None
class CoefficientEditor: """Gets the chemical reaction information for each layer.""" def __init__(self, master, system, coefficient, coefficients, editflag): """Constructor method. Makes the GUI using the list of "Layer" objects "layers." """ # Read the Tkinter information self.master = master self.version = system.version self.fonttype = system.fonttype self.formulatype = system.formulatype self.superfont = get_superfont(self.fonttype) self.subfont = get_superfont(self.formulatype) self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.bgcolor = self.frame.cget('bg') self.top = None self.concunit = system.concunit self.timeunit = system.timeunit self.concunits = system.concunits # Convert mass concentration units to corresponding molar concentration units if self.concunit == system.concunits[0]: self.concunit = system.concunits[3] if self.concunit == system.concunits[1]: self.concunit = system.concunits[4] if self.concunit == system.concunits[2]: self.concunit = system.concunits[5] # Read the system information self.coefficient = coefficient self.coefficients = coefficients self.layers = system.layers self.editflag = editflag if self.editflag == 0: self.layer_full_list = [] self.reaction_full_list = [] for layer in system.layers: self.layer_full_list.append(layer.name) for reaction in system.reactions: self.reaction_full_list.append(reaction.name) self.layer_list = [] self.reaction_list = [] for layer in system.layers: coef_check = 0 for reaction in system.reactions: if coefficients[layer.name][reaction.name].lam == 0: coef_check = 1 if coef_check == 1: self.layer_list.append(layer.name) self.reaction_list.append([]) for reaction in system.reactions: if coefficients[layer.name][reaction.name].lam == 0: self.reaction_list[-1].append(reaction.name) self.layer = StringVar(value=self.layer_list[0]) self.reaction = StringVar(value=self.reaction_list[0][0]) self.equation = StringVar(value='') else: self.layer = coefficient.layer.name self.reaction = coefficient.reaction.name self.equation = coefficient.reaction.equation self.reactants = coefficient.reaction.reactants self.lam = DoubleVar(value=coefficient.lam) self.cancelflag = 0 def make_widgets(self): self.instructions = Label( self.frame, text= 'Please input the following information for the added kinetic process: ' ) self.blankcolumn = Label(self.frame, text=' ', width=2) self.layercolumn = Label(self.frame, text=' ', width=15) self.namecolumn = Label(self.frame, text=' ', width=15) self.equationcolumn = Label(self.frame, text=' ', width=20) self.ratecolumn = Label(self.frame, text=' ', width=10) self.coef1column = Label(self.frame, text=' ', width=10) self.unit1column = Label(self.frame, text=' ', width=3) self.endcolumn = Label(self.frame, text=' ', width=2) self.layerlabel = Label(self.frame, text='Layer') self.namelabel = Label(self.frame, text='Reaction') self.equationlabel = Label(self.frame, text='Chemical equation') self.ratelabel = Label(self.frame, text='Rate equation') self.lamcoeflabel = Label(self.frame, text='Coefficient ' + u'\u03BB') self.blank1 = Label(self.frame, text=' ') self.instructions.grid(row=0, column=0, padx=8, sticky='W', columnspan=11) self.blankcolumn.grid(row=1, column=0, padx=2, sticky='WE') self.layercolumn.grid(row=1, column=1, padx=2, sticky='WE') self.namecolumn.grid(row=1, column=2, padx=2, sticky='WE') self.equationcolumn.grid(row=1, column=3, padx=2, sticky='WE') self.ratecolumn.grid(row=1, column=4, padx=2, sticky='WE') self.coef1column.grid(row=1, column=5, padx=2, sticky='WE') self.unit1column.grid(row=1, column=6, padx=2, sticky='WE') self.endcolumn.grid(row=1, column=7, padx=2, sticky='WE') self.layerlabel.grid(row=2, column=1, padx=2, sticky='WE') self.namelabel.grid(row=2, column=2, padx=2, sticky='WE') self.equationlabel.grid(row=2, column=3, padx=2, sticky='WE') self.ratelabel.grid(row=2, column=4, padx=2, sticky='WE') self.blank1.grid(row=3, column=0, padx=2, sticky='WE', columnspan=11) if self.editflag == 1: self.layerwidget = Label(self.frame, text=self.layer) self.namewidget = Label(self.frame, text=self.reaction) self.equationwidget = Label(self.frame, text=self.equation, font=self.formulatype) self.layerwidget.grid(row=4, column=1, padx=2) self.namewidget.grid(row=4, column=2, padx=2) self.equationwidget.grid(row=4, column=3, padx=10) if self.coefficient.reaction.model == 'User-defined' or self.coefficient.reaction.model == 'Fundamental': unitindex = 0 tkfont = tkFont.Font(font=self.formulatype) tksubfont = tkFont.Font(font=self.subfont) tksuperfont = tkFont.Font(font=self.superfont) # Measure the width of rate and lambda expression rate_len = tkfont.measure(u'r = \u03BB') rate_len = rate_len + tksubfont.measure( str(self.coefficient.reaction.number) + ',') if self.coefficient.layer.number == 0: rate_len = rate_len + tksubfont.measure('D') else: rate_len = rate_len + tksubfont.measure( str(self.coefficient.layer.number)) for reactant in self.coefficient.reaction.reactants: if reactant.index <> 0: rate_len = rate_len + tkfont.measure('C') rate_len = rate_len + tksubfont.measure( reactant.formula) if reactant.index == int(reactant.index): index = int(reactant.index) else: index = reactant.index if index <> 1.: rate_len = rate_len + tksuperfont.measure( str(index) + ' ') unitindex = unitindex + reactant.index print(unitindex) lam_len = tkfont.measure('') if unitindex == int(unitindex): unitindex = int(unitindex) print(unitindex) if (unitindex - 1) != 0: if (unitindex - 1) != -1: lam_len = lam_len + tkfont.measure('(' + self.concunit + ')') lam_len = lam_len + tksuperfont.measure( str(-(unitindex - 1))) else: lam_len = lam_len + tkfont.measure(self.concunit + ' ') lam_len = lam_len + tkfont.measure(self.timeunit) lam_len = lam_len + tksuperfont.measure('-1') self.ratewidget = Text(self.frame, width=int(rate_len * 1.1424219345 / 8) + 1, height=1, font=self.formulatype) self.ratewidget.insert('end', u'r') self.ratewidget.insert('end', ' = ') self.ratewidget.insert('end', u'\u03BB') self.ratewidget.insert( 'end', str(self.coefficient.reaction.number) + ',', 'sub') if self.coefficient.layer.number == 0: self.ratewidget.insert('end', 'D', 'sub') else: self.ratewidget.insert('end', str(self.coefficient.layer.number), 'sub') for reactant in self.coefficient.reaction.reactants: if reactant.index <> 0: self.ratewidget.insert('end', 'C') self.ratewidget.insert('end', reactant.formula, 'sub') if reactant.index == int(reactant.index): index = int(reactant.index) else: index = reactant.index if index <> 1.: self.ratewidget.insert('end', str(index) + ' ', 'super') self.ratewidget.tag_config('sub', offset=-4, font=self.subfont) self.ratewidget.tag_config('super', offset=5, font=self.superfont) self.ratewidget.tag_config('right', justify='right') self.ratewidget.config(state='disabled', background=self.bgcolor, borderwidth=0, spacing3=3) self.lamcoefwidget = Entry(self.frame, textvariable=self.lam, justify='center', width=8) self.lamunitlabel = Text( self.frame, width=int(lam_len * 1.1424219345 / 8) + 1, height=1, font=self.formulatype) if (unitindex - 1) != 0: if (unitindex - 1) != -1: self.lamunitlabel.insert('end', '(' + self.concunit + ')') self.lamunitlabel.insert('end', str(-(unitindex - 1)), 'super') else: self.lamunitlabel.insert('end', self.concunit + ' ') self.lamunitlabel.insert('end', self.timeunit) self.lamunitlabel.insert('end', '-1', 'super') self.lamunitlabel.tag_config('sub', offset=-4, font=self.subfont) self.lamunitlabel.tag_config('super', offset=5, font=self.superfont) self.lamunitlabel.tag_config('right', justify='right') self.lamunitlabel.config(state='disabled', background=self.bgcolor, borderwidth=0, spacing3=3) self.lamcoeflabel.grid(row=2, column=5, padx=2, sticky='WE', columnspan=4) self.ratewidget.grid(row=4, column=4, padx=5) self.lamcoefwidget.grid(row=4, column=5, padx=2, sticky='E') self.lamunitlabel.grid(row=4, column=6, padx=2, sticky='W') else: self.layerwidget = OptionMenu(self.frame, self.layer, *self.layer_list, command=self.click_layer) self.layerwidget.grid(row=4, column=1, padx=2, sticky='WE') self.click_layer() self.okbutton = Button(self.frame, text='OK', width=20, command=self.OK) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.Cancel) self.blank2 = Label(self.frame, text=' ') self.blank3 = Label(self.frame, text=' ') self.blank4 = Label(self.frame, text=' ') self.focusbutton = None self.blank3.grid(row=5) self.okbutton.grid(row=6, columnspan=11) self.cancelbutton.grid(row=7, columnspan=11) self.blank4.grid(row=8) self.okbutton.bind('<Return>', self.OK) self.focusbutton = self.okbutton def click_layer(self, event=None): try: self.namewidget.grid_forget() except: pass self.reaction.set(self.reaction_list[self.layer_list.index( self.layer.get())][0]) self.namewidget = OptionMenu(self.frame, self.reaction, *self.reaction_list[self.layer_list.index( self.layer.get())], command=self.click_reaction) self.namewidget.grid(row=4, column=2, padx=2, sticky='WE') self.click_reaction() def click_reaction(self, event=None): try: self.equationwidget.grid_forget() self.ratewidget.grid_forget() except: pass try: self.lamcoeflabel.grid_forget() self.lamcoefwidget.grid_forget() self.lamunitlabel.grid_forget() except: pass coefficient = self.coefficients[self.layer.get()][self.reaction.get()] self.lam.set(coefficient.lam) self.equation = coefficient.reaction.equation self.equationwidget = Label(self.frame, text=self.equation, font=self.formulatype) self.equationwidget.grid(row=4, column=3, padx=5) if coefficient.reaction.model == 'User-defined' or coefficient.reaction.model == 'Fundamental': unitindex = 0 tkfont = tkFont.Font(font=self.formulatype) tksubfont = tkFont.Font(font=self.subfont) tksuperfont = tkFont.Font(font=self.superfont) # Measure the width of rate and lambda expression rate_len = tkfont.measure(u'r = \u03BB') rate_len = rate_len + tksubfont.measure( str(coefficient.reaction.number) + ',') if coefficient.layer.number == 0: rate_len = rate_len + tksubfont.measure('D') else: rate_len = rate_len + tksubfont.measure( str(coefficient.layer.number)) for reactant in coefficient.reaction.reactants: if reactant.index <> 0: rate_len = rate_len + tkfont.measure('C') rate_len = rate_len + tksubfont.measure(reactant.formula) if reactant.index == int(reactant.index): index = int(reactant.index) else: index = reactant.index if index <> 1.: rate_len = rate_len + tksuperfont.measure( str(index) + ' ') unitindex = unitindex + reactant.index lam_len = tkfont.measure('') if unitindex == int(unitindex): unitindex = int(unitindex) if (unitindex - 1) != 0: if (unitindex - 1) != 1: lam_len = lam_len + tkfont.measure('(' + self.concunit + ')') lam_len = lam_len + tksuperfont.measure( str(-(unitindex - 1))) else: lam_len = lam_len + tkfont.measure(self.concunit) lam_len = lam_len + tkfont.measure(self.timeunit) lam_len = lam_len + tksuperfont.measure('-1') self.ratewidget = Text(self.frame, width=int(rate_len * 1.1424219345 / 8) + 1, height=1, font=self.formulatype) self.ratewidget.insert('end', u'r = \u03BB') self.ratewidget.insert('end', str(coefficient.reaction.number) + ',', 'sub') if coefficient.layer.number == 0: self.ratewidget.insert('end', 'D', 'sub') else: self.ratewidget.insert('end', str(coefficient.layer.number), 'sub') for reactant in coefficient.reaction.reactants: if reactant.index <> 0: self.ratewidget.insert('end', 'C') self.ratewidget.insert('end', reactant.formula, 'sub') if reactant.index == int(reactant.index): index = int(reactant.index) else: index = reactant.index if index <> 1.: self.ratewidget.insert('end', str(index) + ' ', 'super') self.ratewidget.tag_config('sub', offset=-4, font=self.subfont) self.ratewidget.tag_config('super', offset=5, font=self.superfont) self.ratewidget.tag_config('right', justify='right') self.ratewidget.config(state='disabled', background=self.bgcolor, borderwidth=0, spacing3=3) self.lamcoefwidget = Entry(self.frame, textvariable=self.lam, justify='center', width=8) self.lamunitlabel = Text(self.frame, width=int(lam_len * 1.1424219345 / 8) + 1, height=1, font=self.formulatype) if unitindex == int(unitindex): unitindex = int(unitindex) if (unitindex - 1) != 0: if (unitindex - 1) != 1: self.lamunitlabel.insert('end', '(' + self.concunit + ')') self.lamunitlabel.insert('end', str(-(unitindex - 1)), 'super') else: self.lamunitlabel.insert('end', self.concunit) self.lamunitlabel.insert('end', self.timeunit) self.lamunitlabel.insert('end', '-1', 'super') self.lamunitlabel.tag_config('sub', offset=-4, font=self.subfont) self.lamunitlabel.tag_config('super', offset=5, font=self.superfont) self.lamunitlabel.tag_config('right', justify='right') self.lamunitlabel.config(state='disabled', background=self.bgcolor, borderwidth=0, spacing3=3) self.lamcoeflabel.grid(row=2, column=5, padx=2, sticky='WE', columnspan=4) self.ratewidget.grid(row=4, column=4, padx=5) self.lamcoefwidget.grid(row=4, column=5, padx=2, sticky='E') self.lamunitlabel.grid(row=4, column=6, padx=2, sticky='W') self.frame.update() self.focusbutton = None self.master.geometry() self.master.center() def OK(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.editflag == 0: self.layerindex = self.layer_full_list.index(self.layer.get()) self.reactionnumber = self.reaction_full_list.index( self.reaction.get()) + 1 if self.master.window.top is not None: self.master.open_toplevel() elif self.lam == 0: self.coefficient_error() else: self.master.tk.quit() def coefficient_error(self): tkmb.showerror( title=self.version, message='At least one chemical has been replicated in the reaction!' ) self.focusbutton = self.okbutton self.master.tk.lift() def Cancel(self): try: self.reactants = self.reaction.reactants self.products = self.reaction.products except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class ReactionCoefficients: """Gets the model types for each of the layers in the system.""" def __init__(self, master, system, editflag): """Constructor method. Used to defines the layers.""" self.master = master self.version = system.version self.fonttype = system.fonttype self.formulatype = system.formulatype self.superfont = get_superfont(self.fonttype) self.subfont = get_superfont(self.formulatype) self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.bgcolor = self.frame.cget('bg') self.top = None self.system = system self.concunit = system.concunit self.timeunit = system.timeunit self.concunits = system.concunits # Convert mass concentration units to corresponding molar concentration units if self.concunit == system.concunits[0]: self.concunit = system.concunits[3] if self.concunit == system.concunits[1]: self.concunit = system.concunits[4] if self.concunit == system.concunits[2]: self.concunit = system.concunits[5] self.reactions = system.reactions self.layers = system.layers self.coefficients = system.coefficients if system.coefficients == None: self.coefficients = {} for layer in self.layers: layerindex = self.layers.index(layer) self.coefficients[layer.name] = {} for reaction in self.reactions: self.coefficients[layer.name][reaction.name] = Coefficient( layer, reaction) self.name_max = 0 self.formula_max = 0 self.rate_max = 0 self.value_max = 0 unitindex = 0 tkfont = tkFont.Font(font=self.formulatype) tksubfont = tkFont.Font(font=self.superfont) tksuperfont = tkFont.Font(font=self.subfont) for reaction in self.reactions: if tkfont.measure(reaction.name) > self.name_max: self.name_max = tkfont.measure(reaction.name) if tkfont.measure(reaction.equation) > self.formula_max: self.formula_max = tkfont.measure(reaction.equation) rate_len = tkfont.measure(u'r = \u03BB') rate_len = rate_len + tksubfont.measure(str(reaction.number) + ',') rate_len = rate_len + tksubfont.measure(str(10)) for reactant in reaction.reactants: if reactant.index <> 0: rate_len = rate_len + tkfont.measure('C') rate_len = rate_len + tksubfont.measure(reactant.formula) if reactant.index == int(reactant.index): index = int(reactant.index) else: index = reactant.index if index <> 1.: rate_len = rate_len + tksuperfont.measure( str(index) + ' ') unitindex = unitindex + reactant.index lam_len = tkfont.measure(u'\u03BB') lam_len = lam_len + tksubfont.measure(str(reaction.number) + ',') lam_len = lam_len + tksubfont.measure(str(10)) lam_len = lam_len + tkfont.measure(' = ' + str(1000) + ' ') if unitindex == int(unitindex): unitindex = int(unitindex) if (unitindex - 1) != 0: if (unitindex - 1) != 1: lam_len = lam_len + tkfont.measure('(' + self.concunit + ')') lam_len = lam_len + tksuperfont.measure( str(-(unitindex - 1))) else: lam_len = lam_len + tkfont.measure(self.concunit) lam_len = lam_len + tkfont.measure(self.timeunit) lam_len = lam_len + tksuperfont.measure('-1') if self.rate_max < rate_len: self.rate_max = rate_len if self.value_max < lam_len: self.value_max = lam_len def make_widgets(self): """Makes the widgets for the GUI.""" self.instructions = Label( self.tframe, text='Please input the reaction information in each layer: ' ) self.blankcolumn = Label(self.tframe, text='', font='courier 10', width=1) self.editcolumn = Label(self.tframe, text='', font='courier 10', width=6) self.delcolumn = Label(self.tframe, text='', font='courier 10', width=6) self.layercolumn = Label(self.tframe, text='', font='courier 10', width=10) self.namecolumn = Label(self.tframe, text='', font='courier 10', width=max(int(self.name_max / 8) + 1, 15)) self.equationcolumn = Label(self.tframe, text='', font='courier 10', width=max( int(self.formula_max / 8) + 1, 20)) self.ratecolumn = Label(self.tframe, text='', font='courier 10', width=max(int(self.rate_max / 8) + 1, 10)) self.coefcolumn = Label(self.tframe, text='', font='courier 10', width=max(int(self.value_max / 8) + 1, 10)) self.endcolumn = Label(self.tframe, text='', font='courier 10', width=1) self.layerlabel = Label(self.tframe, text='Layer') self.namelabel = Label(self.tframe, text='Reaction') self.equationlabel = Label(self.tframe, text='Chemical equation') self.ratelabel = Label(self.tframe, text='Rate equation') self.coeflabel = Label(self.tframe, text='Coefficient') self.botblankcolumn = Label(self.frame, text='', font='courier 10', width=1) self.boteditcolumn = Label(self.frame, text='', font='courier 10', width=6) self.botdelcolumn = Label(self.frame, text='', font='courier 10', width=6) self.botlayercolumn = Label(self.frame, text='', font='courier 10', width=10) self.botnamecolumn = Label(self.frame, text='', font='courier 10', width=max(int(self.name_max / 8) + 1, 15)) self.botequationcolumn = Label(self.frame, text='', font='courier 10', width=max( int(self.formula_max / 8) + 1, 20)) self.botratecolumn = Label(self.frame, text='', font='courier 10', width=max(int(self.rate_max / 8) + 1, 10)) self.botcoefcolumn = Label(self.frame, text='', font='courier 10', width=max(int(self.value_max / 8) + 1, 10)) self.botendcolumn = Label(self.frame, text='', font='courier 10', width=1) self.addwidget = Button(self.bframe, text='Add reactions', command=self.addcoefficient, width=20) self.blank1 = Label(self.bframe, text=' ') self.blank2 = Label(self.bframe, text=' ') #self.blank3 = Label (self.frame, text = ' ') self.blank4 = Label(self.bframe, text=' ') self.topline = Label(self.frame, width=10, text='-' * 1000) #show the widgets on the grid self.instructions.grid(row=0, column=0, padx=8, columnspan=6, sticky='W') self.blankcolumn.grid(row=1, column=0, sticky='WE', padx=1) self.layercolumn.grid(row=1, column=1, sticky='WE', padx=4) self.editcolumn.grid(row=1, column=2, sticky='WE', padx=1, pady=1) self.delcolumn.grid(row=1, column=3, sticky='WE', padx=1, pady=1) self.namecolumn.grid(row=1, column=4, sticky='WE', padx=4) self.equationcolumn.grid(row=1, column=5, sticky='WE', padx=4) self.ratecolumn.grid(row=1, column=6, sticky='WE', padx=4) self.coefcolumn.grid(row=1, column=7, sticky='WE', padx=4) self.endcolumn.grid(row=1, column=8, sticky='WE', padx=4) self.layerlabel.grid(row=2, column=1, padx=1, sticky='WE', pady=4) self.namelabel.grid(row=2, column=4, padx=1, sticky='WE', pady=4) self.equationlabel.grid(row=2, column=5, padx=1, sticky='WE', pady=4) self.ratelabel.grid(row=2, column=6, padx=1, sticky='WE', pady=4) self.coeflabel.grid(row=2, column=7, padx=1, sticky='WE', pady=4) #self.blank3.grid(row = 3) self.updatecoefficients() def updatecoefficients(self): self.addwidget.grid_forget() self.blank1.grid_forget() self.blank2.grid_forget() self.topline.grid_forget() namelabellength = 15 full_check = 1 self.topline.grid(row=0, column=1, columnspan=7, sticky='WE', pady=1) row = 1 for layer in self.layers: row_layer = row try: layer.remove_reactionwidgets() except: pass for reaction in self.reactions: try: self.coefficients[layer.name][ reaction.name].remove_propertieswidgets() except: pass if self.coefficients[layer.name][reaction.name].lam <> 0: self.coefficients[layer.name][ reaction.name].propertieswidgets( self.frame, row, self.master, self.formulatype, self.superfont, self.subfont, self.timeunit, self.concunit) row = row + 1 else: full_check = 0 layer.reactionwidgets(self.frame, row, row_layer) row = row + 2 self.botblankcolumn.grid(row=row, column=0, sticky='WE', padx=1) self.botlayercolumn.grid(row=row, column=1, sticky='WE', padx=4) self.boteditcolumn.grid(row=row, column=2, sticky='WE', padx=1, pady=1) self.botdelcolumn.grid(row=row, column=3, sticky='WE', padx=1, pady=1) self.botnamecolumn.grid(row=row, column=4, sticky='WE', padx=4) self.botequationcolumn.grid(row=row, column=5, sticky='WE', padx=4) self.botratecolumn.grid(row=row, column=6, sticky='WE', padx=4) self.botcoefcolumn.grid(row=row, column=7, sticky='WE', padx=4) self.botendcolumn.grid(row=row, column=8, sticky='WE', padx=4) row = row + 1 self.blank1.grid(row=row, columnspan=11, sticky='WE') row = row + 1 self.blank2.grid(row=row, columnspan=11) row = row + 1 if full_check == 0: self.addwidget.grid(row=row, columnspan=11) row = row + 1 else: self.blank4.grid(row=row, columnspan=11) row = row + 1 self.focusbutton = None self.master.geometry() self.master.center() def addcoefficient(self, event=None): if self.top is None: self.top = CapSimWindow(master=self.master, buttons=2) self.top.make_window( CoefficientEditor(self.top, self.system, self.coefficients[self.layers[0].name][ self.reactions[0].name], self.coefficients, editflag=0)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.coefficients[self.top.window.layer.get()][ self.top.window.reaction.get()].get_coefficients( self.top.window) if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror( title=self.system.version, message= 'Please close the existing parameter input window first.') self.top.tk.focus() self.updatecoefficients() def editcoefficient(self, layername, reactionname): if self.top is None: self.top = CapSimWindow(master=self.master, buttons=2) self.top.make_window( CoefficientEditor(self.top, self.system, self.coefficients[layername][reactionname], self.coefficients, editflag=1)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.coefficients[layername][reactionname].get_coefficients( self.top.window) if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror( title=self.system.version, message= 'Please close the existing parameter input window first.') self.top.tk.focus() self.updatecoefficients() def delcoefficient(self, layername, reactionname): self.coefficients[layername][reactionname].lam = 0 self.updatecoefficients() def OK(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class MixtureEditor: """Gets the contaminant properties.""" def __init__(self, master, system, matrix, matrices, materials, editflag): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) #superscript font self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.top = None #flag for existence of toplevel# self.matrix = matrix self.matrices = matrices self.materials = materials self.mixing_models = ['Linear', 'None'] self.name = StringVar(value='Mixture') #matrix name self.model = StringVar(value=self.mixing_models[0]) #model name self.e = DoubleVar() #stores the porosity self.rho = DoubleVar() #stores the bulk density self.foc = DoubleVar() #stores the organic carbon fraction self.components = [] #components self.editflag = editflag self.cancelflag = 0 if editflag == 1: #Detemine whether the chemical is added or edited for component in self.matrix.components: self.components.append(component.copy()) self.components[-1].name = StringVar( value=self.components[-1].name) self.components[-1].mfraction = DoubleVar( value=self.components[-1].mfraction) self.name.set(self.matrix.name) self.model.set(self.matrix.model) self.e.set(self.matrix.e) self.rho.set(self.matrix.rho) self.foc.set(self.matrix.foc) def make_widgets(self): """Make the widgets for the window.""" self.bgcolor = self.frame.cget('bg') self.instructions = Label( self.frame, text= 'Please provides the following information about the mixture: ' ) self.blank1 = Label(self.frame, text=' ', width=15) self.blankcolumn = Label(self.frame, text=' ', width=1) self.delcolumn = Label(self.frame, text=' ', width=6) self.compcolumn = Label(self.frame, text=' ', width=18) self.fraccolumn = Label(self.frame, text=' ', width=10) self.ecolumn = Label(self.frame, text=' ', width=10) self.rhocolumn = Label(self.frame, text=' ', width=15) self.foccolumn = Label(self.frame, text=' ', width=20) self.namelabel = Label(self.frame, text='Name') self.elabel = Label(self.frame, text='Porosity') self.rholabel = Label(self.frame, text='Bulk density (' + u'g/cm\u00B3' + ')') self.foclabel = Label(self.frame, text='Organic carbon fraction') self.namewidget = Entry(self.frame, textvariable=self.name, justify='center', width=16) self.ewidget = Entry(self.frame, textvariable=self.e, justify='center', width=10) self.rhowidget = Entry(self.frame, textvariable=self.rho, justify='center', width=10) self.focwidget = Entry(self.frame, textvariable=self.foc, justify='center', width=10) self.complabel = Label(self.frame, text='Component') self.compflabel = Label(self.frame, text='Weight fraction') self.compelabel = Label(self.frame, text='Porosity') self.comprholabel = Label(self.frame, text='Bulk density (' + u'g/cm\u00B3' + ')') self.compfoclabel = Label(self.frame, text='Organic carbon fraction') self.addwidget = Button(self.frame, text='Add components', width=20, command=self.add_components) self.loadwidget = Button(self.frame, text='Load components', width=20, command=self.load_components) self.esitimator = Button(self.frame, text='Estimate Mixture Properties', width=20, command=self.estimate_mixture) self.okbutton = Button(self.frame, text='OK', width=20, command=self.OK) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.Cancel) self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') self.blank3 = Label(self.frame, text=' ') #show the widgets on the grid self.instructions.grid(row=0, column=0, columnspan=7, padx=8, sticky='W') self.blank1.grid(row=1, column=0, columnspan=2) self.blankcolumn.grid(row=3, column=0, sticky='WE', padx=1, pady=1) self.delcolumn.grid(row=3, column=1, sticky='WE', padx=1, pady=1) self.compcolumn.grid(row=3, column=2, sticky='WE', padx=1, pady=1) self.fraccolumn.grid(row=3, column=3, sticky='WE', padx=1, pady=1) self.ecolumn.grid(row=3, column=4, sticky='WE', padx=1, pady=1) self.rhocolumn.grid(row=3, column=5, sticky='WE', padx=1, pady=1) self.foccolumn.grid(row=3, column=6, sticky='WE', padx=1, pady=1) self.namelabel.grid(row=4, column=2, sticky='WE', padx=4, pady=1) self.elabel.grid(row=4, column=4, sticky='WE', padx=1, pady=1) self.rholabel.grid(row=4, column=5, sticky='WE', padx=1, pady=1) self.foclabel.grid(row=4, column=6, sticky='WE', padx=1, pady=1) self.namewidget.grid(row=5, column=2, padx=4, pady=1) self.ewidget.grid(row=5, column=4, padx=1, pady=1) self.rhowidget.grid(row=5, column=5, padx=1, pady=1) self.focwidget.grid(row=5, column=6, padx=1, pady=1) self.blank3.grid(row=6, column=0, columnspan=2) self.complabel.grid(row=7, column=2, sticky='WE', padx=4, pady=1) self.compflabel.grid(row=7, column=3, sticky='WE', padx=1, pady=1) self.compelabel.grid(row=7, column=4, sticky='WE', padx=1, pady=1) self.comprholabel.grid(row=7, column=5, sticky='WE', padx=1, pady=1) self.compfoclabel.grid(row=7, column=6, sticky='WE', padx=1, pady=1) self.update_components() def update_components(self): try: self.addwidget.grid_forget() self.okbutton.grid_forget() self.cancelbutton.grid_forget() except: pass row = 8 for component in self.components: try: component.get_component() component.remove_propertieswidgets() except: pass component.number = self.components.index(component) + 1 component.propertieswidgets(self.frame, row, self.master, self.materials, self.matrices) row = row + 1 self.blank1.grid(row=row) row = row + 1 self.addwidget.grid(row=row, columnspan=11) row = row + 1 self.loadwidget.grid(row=row, columnspan=11) row = row + 1 self.esitimator.grid(row=row, columnspan=11) row = row + 1 self.okbutton.grid(row=row, columnspan=11) row = row + 1 self.cancelbutton.grid(row=row, columnspan=11) row = row + 1 self.blank2.grid(row=row) self.okbutton.bind('<Return>', self.OK) self.focusbutton = self.okbutton self.master.geometry() def add_components(self, event=None): total_fraction = 0 for component in self.components: total_fraction = total_fraction + component.mfraction.get() self.components.append(MatrixComponent(len(self.components) + 1)) self.components[-1].name = ' ' if total_fraction > 1: self.components[-1].mfraction = 0 else: self.components[-1].mfraction = 1 - total_fraction self.components[-1].fraction = 0 self.components[-1].e = 0 self.components[-1].rho = 0 self.components[-1].foc = 0 self.update_components() def load_components(self, event=None): total_fraction = 0 for component in self.components: total_fraction = total_fraction + component.mfraction.get() self.components.append(MatrixComponent(len(self.components) + 1)) self.components[-1].name = ' ' if total_fraction > 1: self.components[-1].mfraction = 0 else: self.components[-1].mfraction = 1 - total_fraction self.update_components() def del_component(self, number): self.components[number - 1].remove_propertieswidgets() self.components.remove(self.components[number - 1]) self.update_components() def estimate_mixture(self): total_fraction = 0 for component in self.components: total_fraction = total_fraction + component.mfraction.get() if total_fraction <> 1.: self.fraction_error() else: self.calculate_matrix() self.frame.update() self.update_components() def OK(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" components_check = 0 component_list = [component.name for component in self.components] for name in component_list: if component_list.count(name) > 1: components_check = 1 if self.editflag == 0: check = [(matrix.name == self.name.get()) for matrix in self.matrices[0:-1]] else: check = [0] total_fraction = 0 rho_flag = 0 for component in self.components: total_fraction = total_fraction + component.mfraction.get() if component.rho.get() <= 0: rho_flag = 1 if self.master.window.top is not None: self.master.open_toplevel() elif sum(check) >= 1 or self.name.get() == '': self.matrix_error() elif len(self.components) < 2: self.empty_component() elif total_fraction <> 1.: self.fraction_error() elif rho_flag == 1: self.rho_error() elif components_check == 1: self.replicate_error() else: self.calculate_matrix() self.master.tk.quit() def matrix_error(self): tkmb.showerror( title=self.version, message='This matrix has already been added to the matrix list!') self.focusbutton = self.okbutton self.master.tk.lift() def empty_component(self): tkmb.showerror( title=self.version, message='The mixture must consist at least two components') self.focusbutton = self.okbutton self.master.tk.lift() def fraction_error(self): tkmb.showinfo(self.version, 'The sum of the weight fraction is not 1, please check') self.focusbutton = self.okbutton self.master.tk.lift() def rho_error(self): tkmb.showinfo( self.version, 'The bulk density of a component must be a positive value') self.focusbutton = self.okbutton self.master.tk.lift() def replicate_error(self): tkmb.showinfo(self.version, 'At least one component is replicated in the mixture') self.focusbutton = self.okbutton self.master.tk.lift() def Cancel(self): try: self.name.set(self.matrix.name) self.model.set(self.matrix.model) self.e.set(self.matrix.e) self.rho.set(self.matrix.rho) self.foc.set(self.matrix.foc) self.components = self.matrix.components except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit() def calculate_matrix(self): rho_flag = 0 e = 0 rho = 0 moc = 0 foc = 0 fractions = 0 volume = 0 for component in self.components: if component.rho.get() <= 0: rho_flag = 1 if rho_flag == 1: self.rho_error() else: for component in self.components: component.get_component() component.remove_propertieswidgets() volume = volume + component.mfraction / component.rho for component in self.components: component.fraction = component.mfraction / component.rho / volume e = e + component.fraction * component.e rho = rho + component.fraction * component.rho moc = moc + component.fraction * component.rho * component.foc foc = moc / rho self.e.set(round(e, 6)) self.rho.set(round(rho, 6)) self.foc.set(round(foc, 6))
class ChemicalProperties: """Gets the contaminant properties.""" def __init__(self, master, system, database): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) #superscript font self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.top = None #flag for existence of toplevel# self.system = system self.database = database self.diffunit = system.diffunit self.concunit = system.concunit self.concunits = system.concunits if system.chemicals is None: self.chemicals = [] self.nchemicals = 0 else: self.chemicals = system.chemicals self.nchemicals = system.nchemicals def make_widgets(self): """Make the widgets for the window.""" self.bgcolor = self.frame.cget('bg') # Construct all label widgets used in the problem self.instructions = Label( self.tframe, text= ' Please provide the following chemical properties: ' ) self.blankcolumn = Label(self.tframe, text='', width=1) self.editcolumn = Label(self.tframe, text='', width=6) self.delcolumn = Label(self.tframe, text='', width=6) self.numbercolumn = Label(self.tframe, text='', width=6) self.namecolumn = Label(self.tframe, text='', width=18) self.MWcolumn = Label(self.tframe, text='', width=8) self.tempcolumn = Label(self.tframe, text='', width=10) self.Dwcolumn = Label(self.tframe, text='', width=16) self.Koccolumn = Label(self.tframe, text='', width=16) self.Kdoccolumn = Label(self.tframe, text='', width=18) self.Refcolumn = Label(self.tframe, text='', width=17) self.endcolumn = Label(self.tframe, text='', width=1) self.botblankcolumn = Label(self.frame, text='', width=1) self.boteditcolumn = Label(self.frame, text='', width=6) self.botdelcolumn = Label(self.frame, text='', width=6) self.botnumbercolumn = Label(self.frame, text='', width=6) self.botnamecolumn = Label(self.frame, text='', width=18) self.botMWcolumn = Label(self.frame, text='', width=8) self.bottempcolumn = Label(self.frame, text='', width=10) self.botDwcolumn = Label(self.frame, text='', width=16) self.botKoccolumn = Label(self.frame, text='', width=16) self.botKdoccolumn = Label(self.frame, text='', width=18) self.botRefcolumn = Label(self.frame, text='', width=17) self.botendcolumn = Label(self.frame, text='', width=1) self.numberlabel = Label(self.tframe, text='Number') self.namelabel = Label(self.tframe, text='Chemical name') self.MWlabel = Label(self.tframe, text='Molecular\n Weight') self.templabel = Label(self.tframe, text='Temperature') self.Dwlabel = Label(self.tframe, text='Molecular diffusivity\n in water') self.Koclabel = Label(self.tframe, text='Organic carbon\n partition coefficient') self.Kdoclabel = Label( self.tframe, text='Dissolved organic carbon\n partition coefficient') self.Reflabel = Label(self.tframe, text='Reference') self.tempunits = Label(self.tframe, text=unichr(176) + 'C') self.Dwunits = Label(self.tframe, text=self.diffunit) self.Kocunits = Label(self.tframe, text='log(L/kg)') self.Kdocunits = Label(self.tframe, text='log(L/kg)') self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.bframe, text=' ') self.addwidget = Button(self.bframe, text='Add chemicals', command=self.addchemical, width=20) #show the widgets on the grid self.instructions.grid(row=0, column=0, columnspan=9, padx=1, sticky='W') self.blankcolumn.grid(row=1, column=0, sticky='WE', padx=1, pady=1) self.editcolumn.grid(row=1, column=1, sticky='WE', padx=1, pady=1) self.delcolumn.grid(row=1, column=2, sticky='WE', padx=1, pady=1) self.numbercolumn.grid(row=1, column=3, sticky='WE', padx=1, pady=1) self.namecolumn.grid(row=1, column=4, sticky='WE', padx=1, pady=1) self.MWcolumn.grid(row=1, column=5, sticky='WE', padx=1, pady=1) self.tempcolumn.grid(row=1, column=6, sticky='WE', padx=1, pady=1) self.Dwcolumn.grid(row=1, column=7, sticky='WE', padx=1, pady=1) self.Koccolumn.grid(row=1, column=8, sticky='WE', padx=1, pady=1) self.Kdoccolumn.grid(row=1, column=9, sticky='WE', padx=1, pady=1) self.Refcolumn.grid(row=1, column=10, sticky='WE', padx=1, pady=1) self.endcolumn.grid(row=1, column=11, sticky='WE', padx=1, pady=1) self.numberlabel.grid(row=2, column=3, sticky='WE', padx=1, pady=1) self.namelabel.grid(row=2, column=4, sticky='WE', padx=1, pady=1) self.MWlabel.grid(row=2, column=5, sticky='WE', padx=1, pady=1) self.templabel.grid(row=2, column=6, sticky='WE', padx=1, pady=1) self.Dwlabel.grid(row=2, column=7, sticky='WE', padx=1, pady=1) self.Koclabel.grid(row=2, column=8, sticky='WE', padx=1, pady=1) self.Kdoclabel.grid(row=2, column=9, sticky='WE', padx=1, pady=1) self.Reflabel.grid(row=2, column=10, sticky='WE', padx=1, pady=1) self.tempunits.grid(row=3, column=6, sticky='WE', padx=1, pady=1) self.Dwunits.grid(row=3, column=7, sticky='WE', padx=1, pady=1) self.Kocunits.grid(row=3, column=8, sticky='WE', padx=1, pady=1) self.Kdocunits.grid(row=3, column=9, sticky='WE', padx=1, pady=1) self.updatechemicals() def updatechemicals(self): try: self.botblankcolumn.grid_forget() self.boteditcolumn.grid_forget() self.botdelcolumn.grid_forget() self.botnumbercolumn.grid_forget() self.botnamecolumn.grid_forget() self.botMWcolumn.grid_forget() self.bottempcolumn.grid_forget() self.botDwcolumn.grid_forget() self.botKoccolumn.grid_forget() self.botKdoccolumn.grid_forget() self.botRefcolumn.grid_forget() self.botendcolumn.grid_forget() except: pass chemicals_list = self.database.keys() for chemical in self.chemicals: if chemical.soluable == 1: try: chemicals_list.remove(chemical.name) except: pass self.addwidget.grid_forget() namelabellength = 18 reflabellength = 18 row = 0 for chemical in self.chemicals: try: chemical.remove_chemicalwidgets() except: pass chemical.number = self.chemicals.index(chemical) + 1 chemical.chemicalwidgets(self.frame, row, self.master) row = row + 1 if namelabellength < chemical.namelabel.winfo_reqwidth() / 8: namelabellength = int( chemical.namelabel.winfo_reqwidth() / 8) + 1 if reflabellength < chemical.Reflabel.winfo_reqwidth( ) / 8 * 1.1424219345: reflabellength = int( chemical.Reflabel.winfo_reqwidth() / 8 * 1.1424219345) + 1 self.namecolumn.config(width=namelabellength) self.Refcolumn.config(width=reflabellength) self.botnamecolumn.config(width=namelabellength) self.botRefcolumn.config(width=reflabellength) self.botblankcolumn.grid(row=row, column=0, sticky='WE', padx=1, pady=1) self.boteditcolumn.grid(row=row, column=1, sticky='WE', padx=1, pady=1) self.botdelcolumn.grid(row=row, column=2, sticky='WE', padx=1, pady=1) self.botnumbercolumn.grid(row=row, column=3, sticky='WE', padx=1, pady=1) self.botnamecolumn.grid(row=row, column=4, sticky='WE', padx=1, pady=1) self.botMWcolumn.grid(row=row, column=5, sticky='WE', padx=1, pady=1) self.bottempcolumn.grid(row=row, column=6, sticky='WE', padx=1, pady=1) self.botDwcolumn.grid(row=row, column=7, sticky='WE', padx=1, pady=1) self.botKoccolumn.grid(row=row, column=8, sticky='WE', padx=1, pady=1) self.botKdoccolumn.grid(row=row, column=9, sticky='WE', padx=1, pady=1) self.botRefcolumn.grid(row=row, column=10, sticky='WE', padx=1, pady=1) self.botendcolumn.grid(row=row, column=11, sticky='WE', padx=1, pady=1) row = 0 self.blank2.grid(row=row) row = row + 1 if len(chemicals_list) > 0: self.addwidget.grid(row=row, columnspan=11) row = row + 1 self.addwidget.bind('<Return>', self.addchemical) if self.nchemicals == 0: self.focusbutton = self.addwidget else: self.focusbutton = None self.master.geometry() self.master.center() def addchemical(self, event=None): self.nchemicals = self.nchemicals + 1 self.chemicals.append(Chemical(self.nchemicals, soluable=1)) if self.top is None: self.top = CapSimWindow(master=self.master, buttons=2) self.top.make_window( ChemicalEditor(self.top, self.system, self.chemicals[-1], self.chemicals, self.database, editflag=0)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.chemicals[-1].get_chemical(self.top.window) else: self.chemicals.remove(self.chemicals[-1]) self.nchemicals = self.nchemicals - 1 if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror( title=self.system.version, message= 'Please close the existing parameter input window first.') self.top.tk.focus() self.updatechemicals() def editchemical(self, number): if self.top is None: self.top = CapSimWindow(master=self.master, buttons=2) self.top.make_window( ChemicalEditor(self.top, self.system, self.chemicals[number - 1], self.chemicals, self.database, editflag=1)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.chemicals[number - 1].get_chemical(self.top.window) if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror( title=self.system.version, message= 'Please close the existing parameter input window first.') self.top.tk.focus() self.updatechemicals() def deletechemical(self, number): if self.top is None: self.top = CapSimWindow(master=self.master, buttons=2) self.top.make_window( ChemicalDeleter(self.top, self.system, self.chemicals[number - 1])) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.chemicals[number - 1].remove_chemicalwidgets() self.chemicals.remove(self.chemicals[number - 1]) self.nchemicals = self.nchemicals - 1 if self.top is not None: self.top.destroy() self.top = None self.updatechemicals() def error_check(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" error = 0 if self.nchemicals == 0: error = 1 return error def warning(self): tkmb.showerror( title=self.version, message= 'No chemical has been selected, please add chemicals by pressing the button "Add chemicals"' ) self.focusbutton = None self.master.tk.lift()
class ReactionProperties: """Gets the model types for each of the layers in the system.""" def __init__(self, master, system): """Constructor method. Used to defines the layers.""" self.master = master self.system = system self.version = system.version self.fonttype = system.fonttype self.formulatype = system.formulatype self.superfont = get_superfont(self.fonttype) self.subfont = get_superfont(self.formulatype) self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.bgcolor = self.frame.cget('bg') self.top = None self.chemicals = system.chemicals if master.master is None: self.defaults = 1 if system.reactions is None: self.reactions = [] else: self.reactions = system.reactions def make_widgets(self): """Makes the widgets for the GUI.""" self.instructions = Label(self.tframe, text = 'Please input the kinetic processes in the system: ') self.blankcolumn = Label(self.tframe, text = '', font = 'courier 10', width = 1 ) self.editcolumn = Label(self.tframe, text = '', font = 'courier 10', width = 6 ) self.delcolumn = Label(self.tframe, text = '', font = 'courier 10', width = 6 ) self.numbercolumn = Label(self.tframe, text = '', font = 'courier 10', width = 5 ) self.namecolumn = Label(self.tframe, text = '', font = 'courier 10', width = 15) self.equationcolumn = Label(self.tframe, text = '', font = 'courier 10', width = 20) self.ratecolumn = Label(self.tframe, text = '', font = 'courier 10', width = 10) self.endcolumn = Label(self.tframe, text = '', font = 'courier 10', width = 2) self.numberlabel = Label(self.tframe, text = 'Number') self.namelabel = Label(self.tframe, text = 'Name') self.equationlabel = Label(self.tframe, text = 'Chemical equation') self.ratelabel = Label(self.tframe, text = 'Rate equation') self.botblankcolumn = Label(self.frame, text = '', font = 'courier 10', width = 1 ) self.boteditcolumn = Label(self.frame, text = '', font = 'courier 10', width = 6 ) self.botdelcolumn = Label(self.frame, text = '', font = 'courier 10', width = 6 ) self.botnumbercolumn = Label(self.frame, text = '', font = 'courier 10', width = 5 ) self.botnamecolumn = Label(self.frame, text = '', font = 'courier 10', width = 15) self.botequationcolumn = Label(self.frame, text = '', font = 'courier 10', width = 20) self.botratecolumn = Label(self.frame, text = '', font = 'courier 10', width = 10) self.botendcolumn = Label(self.frame, text = '', font = 'courier 10', width = 2) self.addwidget = Button(self.bframe, text = 'Add reactions', command = self.addreaction, width = 20) self.blank1 = Label (self.bframe, text = ' ') self.blank2 = Label (self.bframe, text = ' ') #show the widgets on the grid self.instructions.grid( row = 0, column = 0, padx = 8, columnspan = 6, sticky = 'W') self.blankcolumn.grid( row = 1, column = 0, padx = 1, sticky = 'WE', pady = 1) self.editcolumn.grid( row = 1, column = 1, padx = 1, sticky = 'WE', pady = 1) self.delcolumn.grid( row = 1, column = 2, padx = 1, sticky = 'WE', pady = 1) self.numbercolumn.grid( row = 1, column = 3, padx = 4, sticky = 'WE') self.namecolumn.grid( row = 1, column = 4, padx = 4, sticky = 'WE') self.equationcolumn.grid( row = 1, column = 5, padx = 4, sticky = 'WE') self.ratecolumn.grid( row = 1, column = 6, padx = 4, sticky = 'WE') self.endcolumn.grid( row = 1, column = 7, padx = 4, sticky = 'WE') self.numberlabel.grid( row = 2, column = 3, padx = 1, sticky = 'WE', pady = 4) self.namelabel.grid( row = 2, column = 4, padx = 1, sticky = 'WE', pady = 4) self.equationlabel.grid( row = 2, column = 5, padx = 1, sticky = 'WE', pady = 4) self.ratelabel.grid( row = 2, column = 6, padx = 1, sticky = 'WE', pady = 4) self.updatereactions() def updatereactions(self): self.addwidget.grid_forget() self.blank1.grid_forget() self.blank2.grid_forget() namelabellength = 15 equationlabellength = 20 ratelabellength = 10 row = 4 for reaction in self.reactions: try: reaction.remove_propertieswidgets() except:pass reaction.number = self.reactions.index(reaction) + 1 reaction.propertieswidgets(self.frame, row, self.master, self.formulatype, self.superfont, self.subfont, self.bgcolor) row = row + 1 if namelabellength < reaction.namelabel.winfo_reqwidth()/8: namelabellength = int(reaction.namelabel.winfo_reqwidth()/8) + 1 if equationlabellength < reaction.equalabel.winfo_reqwidth()/8: equationlabellength = int(reaction.equalabel.winfo_reqwidth()/8) + 1 if ratelabellength < reaction.ratewidget.winfo_reqwidth()/8: ratelabellength = int(reaction.ratewidget.winfo_reqwidth()/8) + 1 self.botblankcolumn.grid( row = row, column = 0, padx = 1, sticky = 'WE',pady = 1) self.boteditcolumn.grid( row = row, column = 1, padx = 1, sticky = 'WE',pady = 1) self.botdelcolumn.grid( row = row, column = 2, padx = 1, sticky = 'WE',pady = 1) self.botnumbercolumn.grid( row = row, column = 3, padx = 4, sticky = 'WE') self.botnamecolumn.grid( row = row, column = 4, padx = 4, sticky = 'WE') self.botequationcolumn.grid( row = row, column = 5, padx = 4, sticky = 'WE') self.botratecolumn.grid( row = row, column = 6, padx = 4, sticky = 'WE') self.botendcolumn.grid( row = row, column = 7, padx = 4, sticky = 'WE') self.namecolumn.config(width = namelabellength) self.equationcolumn.config(width = equationlabellength) self.ratecolumn.config(width = ratelabellength) self.botnamecolumn.config(width = namelabellength) self.botequationcolumn.config(width = equationlabellength) self.botratecolumn.config(width = ratelabellength) row = 0 self.blank1.grid(row = row) row = row + 1 self.blank2.grid(row = row) row = row + 1 self.addwidget.grid(row = row, columnspan = 11) row = row + 1 self.focusbutton = None self.master.geometry() self.master.center() def addreaction(self, event = None): self.reactions.append(Reaction(len(self.reactions)+1)) if self.top is None: self.top = CapSimWindow(master = self.master, buttons = 2) self.top.make_window(ReactionEditor(self.top, self.system, self.reactions[-1], editflag = 0)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.reactions[-1].get_reaction(self.top.window) else: self.reactions.remove(self.reactions[-1]) if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror(title = self.system.version, message = 'Please close the existing parameter input window first.') self.top.tk.focus() self.updatereactions() def editreaction(self, number): if self.top is None: self.top = CapSimWindow(master = self.master, buttons = 2) self.top.make_window(ReactionEditor(self.top, self.system, self.reactions[number-1], editflag = 1)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.reactions[number-1].get_reaction(self.top.window) if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror(title = self.system.version, message = 'Please close the existing parameter input window first.') self.top.tk.focus() self.updatereactions() def delreaction(self, number): if self.top is None: self.top = CapSimWindow(master = self.master, buttons = 2) self.top.make_window(ReactionDeleter(self.top, self.system, self.reactions[number-1])) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.reactions[number-1].remove_propertieswidgets() self.reactions.remove(self.reactions[number-1]) if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror(title = self.system.version, message = 'Please close the existing parameter input window first.') self.top.tk.focus() self.updatereactions()
class GuiImageSimilarResolver(object): def __init__(self, dry_run): self.dry_run = dry_run self.root = Tk() self.root.bind('s', self.are_similar) self.root.bind('d', self.are_not_similar) self.root.bind('n', self.are_not_similar) self.root.bind('c', self.clear_feedback) self.root.bind('q', self.quit) self.root.bind('<Left>', self.goto_prev) self.root.bind('<Right>', self.goto_next) self.root.bind('f', self.toggle_skip) screen_size = get_screen_size(self.root) self.max_image_size = (int(0.4 * screen_size[0]), int(0.75 * screen_size[1])) self.pairs = [] self.item_frame = Frame(self.root) self.background = self.item_frame.cget("background") self.item_frame.pack(expand=False, side=TOP) self.skip_pairs_with_feedback = 1 self.ref_counting = None self.label_sim = None self.label_bppl = self.label_bppr = None self.label_pixelsl = self.label_pixelsr = None self.label_resl = self.label_resr = None self.label_sizel = self.label_sizer = None self.label_pathl = self.label_pathr = None self.label_imgl = self.label_imgr = None self.create_gui() self.index = None def toggle_skip(self, *_): self.skip_pairs_with_feedback = not self.skip_pairs_with_feedback def goto_prev(self, *_): self.change_index(-1) def goto_next(self, *_): self.change_index(1) def are_similar(self, *_): self.save_feedback(1) def are_not_similar(self, *_): self.save_feedback(0) def clear_feedback(self, *_): self.pairs[self.index].clear_feedback() self.change_index(1) def save_feedback(self, are_similar): self.pairs[self.index].save_feedback(are_similar) self.change_index(1) def change_index(self, change): last_index = self.index while 1: self.index += change if self.index < 0: self.index = 0 if self.index >= len(self.pairs): self.index = len(self.pairs) - 1 if self.index == last_index: break if not self.skip_pairs_with_feedback: break if not self.has_feedback(): break last_index = self.index self.update_labels() def quit(self, _): self.root.destroy() def resolve(self, pair): self.pairs.append(pair) def finished(self): if self.pairs: self.index = 0 self.update_labels() mainloop() else: print ("No duplicated images found. Maybe f_image.py was not run" + " yet? Or there are no images in the path given.") def create_gui(self): root = self.item_frame row = 0 self.label_sim = Label(root, text="no text (sim)") self.label_sim.grid(row=row, column=0, columnspan=2) row += 1 self.label_imgl = Label(root, text="no image") self.label_imgl.grid(row=row, column=0) self.label_imgr = Label(root, text="no image") self.label_imgr.grid(row=row, column=1) row += 1 self.label_pathl = Label(root, text="no text (path)") self.label_pathl.grid(row=row, column=0) self.label_pathr = Label(root, text="no text (path)") self.label_pathr.grid(row=row, column=1) row += 1 self.label_sizel = Label(root, text="no text (size)") self.label_sizel.grid(row=row, column=0) self.label_sizer = Label(root, text="no text (size)") self.label_sizer.grid(row=row, column=1) row += 1 self.label_pixelsl = Label(root, text="no text (pixels)") self.label_pixelsl.grid(row=row, column=0) self.label_pixelsr = Label(root, text="no text (pixels)") self.label_pixelsr.grid(row=row, column=1) row += 1 self.label_resl = Label(root, text="no text (resolution)") self.label_resl.grid(row=row, column=0) self.label_resr = Label(root, text="no text (resolution)") self.label_resr.grid(row=row, column=1) row += 1 self.label_bppl = Label(root, text="no text (bbp)") self.label_bppl.grid(row=row, column=0) self.label_bppr = Label(root, text="no text (bbp)") self.label_bppr.grid(row=row, column=1) row += 1 Button(root, text="Similar images", underline=0, command=self.are_similar).grid(row=row, column=0) Button(root, text="Do not match (images are NOT similar)", underline=0, command=self.are_not_similar).grid(row=row, column=1) def has_feedback(self): pair = self.pairs[self.index] feedback = pair.get_feedback() return feedback is not None def update_labels(self): pair = self.pairs[self.index] feedback = pair.get_feedback() if feedback is None: feedback = "not yet" background = self.background elif feedback == 0: feedback = "not similar" background = "#FFE0E0" elif feedback == 1: feedback = "similar" background = "#E0FFE0" else: assert 0 img1 = ImageRelated(pair.path1, self.max_image_size, background) img2 = ImageRelated(pair.path2, self.max_image_size, background) self.ref_counting = (img1, img2) self.item_frame.config(background=background) text = "%d/%d similarity=%f feedback = %s skip=%d" % ( self.index + 1, len(self.pairs), self.pairs[self.index].similarity, feedback, self.skip_pairs_with_feedback) self.label_sim.config(background=background, text=text) self.label_imgl.config(text=None, image=img1.tk_image) self.label_imgr.config(text=None, image=img2.tk_image) size1 = img1.file_size size2 = img2.file_size color1, color2 = get_colors(cmp(size1, size2)) self.label_pathl.config(text=split_path(img1.path)) self.label_pathr.config(text=split_path(img2.path)) self.label_sizel.config(fg=color1, text=format_bytes(size1)) self.label_sizer.config(fg=color2, text=format_bytes(size2)) color1, color2 = get_colors(cmp(img1.pixels, img2.pixels)) self.label_pixelsl.config(fg=color1, text=format_bytes(img1.pixels)) self.label_pixelsr.config(fg=color2, text=format_bytes(img2.pixels)) self.label_resl.config(fg=color1, text="%d x %d" % img1.image.size) self.label_resr.config(fg=color2, text="%d x %d" % img2.image.size) color1, color2 = get_colors(cmp(img1.bpp, img2.bpp)) self.label_bppl.config(fg=color1, text="%f" % img1.bpp) self.label_bppr.config(fg=color2, text="%f" % img2.bpp)
class ReactionEditor: """Gets the chemical reaction information for each layer.""" def __init__(self, master, system, reaction, editflag): """Constructor method. Makes the GUI using the list of "Layer" objects "layers." """ # Read the Tkinter information self.master = master self.fonttype = system.fonttype self.formulatype = system.formulatype self.version = system.version self.superfont = get_superfont(self.fonttype) self.subfont = get_superfont(self.formulatype) self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.bgcolor = self.frame.cget('bg') self.top = None self.system = system # Read the system information self.chemicals = system.chemicals self.reaction = reaction self.editflag = editflag # Define the reaction chemical information self.chemical_list = [chemical.name for chemical in self.chemicals] self.formula_list = [chemical.formula for chemical in self.chemicals] self.MW_list = [chemical.MW for chemical in self.chemicals] self.models = ['Fundamental', 'User-defined'] self.name = StringVar(value='Reaction ' + str(reaction.number)) self.model = StringVar(value=self.models[0]) self.reactants = [] self.products = [] #self.stoichcoef = reaction.stoichcoef if editflag == 1: self.name = StringVar(value=reaction.name) self.model = StringVar(value=reaction.model) self.reactants = [ reactant.copy() for reactant in reaction.reactants ] self.products = [product.copy() for product in reaction.products] for reactant in self.reactants: reactant.coef = DoubleVar(value=reactant.coef) reactant.index = DoubleVar(value=reactant.index) reactant.name = StringVar(value=reactant.name) reactant.formula = StringVar(value=reactant.formula) reactant.MW = DoubleVar(value=reactant.MW) for product in self.products: product.coef = DoubleVar(value=product.coef) product.name = StringVar(value=product.name) product.formula = StringVar(value=product.formula) product.MW = DoubleVar(value=product.MW) self.cancelflag = 0 def make_widgets(self): self.instructions = Label( self.frame, text= 'Please input the following information for the added kinetic process: ' ) self.reactblankcolumn = Label(self.frame, text=' ', width=2) self.reactdelcolumn = Label(self.frame, text=' ', width=6) self.reactcoefcolumn = Label(self.frame, text=' ', width=6) self.reactnamecolumn = Label(self.frame, text=' ', width=20) self.reactformcolumn = Label(self.frame, text=' ', width=10) self.middlecolumn = Label(self.frame, text=' ', width=14) self.proddelcolumn = Label(self.frame, text=' ', width=6) self.prodcoefcolumn = Label(self.frame, text=' ', width=6) self.prodnamecolumn = Label(self.frame, text=' ', width=20) self.prodformcolumn = Label(self.frame, text=' ', width=10) self.prodblankcolumn = Label(self.frame, text=' ', width=2) self.nameblank = Label(self.frame, text=' ', width=10) self.namelabel = Label(self.frame, text='Name:', width=10) self.namewidget = Entry(self.frame, textvariable=self.name, width=15) self.modellabel = Label(self.frame, text='Kinetic model:', width=10) self.modelwidget = OptionMenu(self.frame, self.model, *self.models, command=self.click_model) self.ratelabel = Label(self.frame, text='Rate equation:', width=10) self.reactlabel = Label(self.frame, text='Reactants') self.prodlabel = Label(self.frame, text='Products') self.reactcoeflabel = Label(self.frame, text='Stoichiometric\ncoefficient') self.reactnamelabel = Label(self.frame, text='Chemical') self.reactformlabel = Label(self.frame, text='Formula') self.prodcoeflabel = Label(self.frame, text='Stoichiometric\ncoefficient') self.prodnamelabel = Label(self.frame, text='Chemical') self.prodformlabel = Label(self.frame, text='Formula') self.addreactwidget = Button(self.frame, text='Add reactant', width=20, command=self.addreactant) self.addprodwidget = Button(self.frame, text='Add product', width=20, command=self.addproduct) self.okbutton = Button(self.frame, text='OK', width=20, command=self.OK) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.Cancel) self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') self.instructions.grid(row=0, column=0, padx=8, sticky='W', columnspan=11) self.nameblank.grid(row=1, column=0, padx=2, sticky='WE', columnspan=4) self.namelabel.grid(row=2, column=0, padx=2, sticky='E', columnspan=3) self.namewidget.grid(row=2, column=3, padx=2, sticky='W') self.modellabel.grid(row=2, column=4, padx=2, sticky='E') self.modelwidget.grid(row=2, column=5, padx=2, sticky='W', columnspan=2) self.ratelabel.grid(row=2, column=7, padx=2, sticky='E') self.reactblankcolumn.grid(row=3, column=0, padx=2, sticky='WE') self.reactdelcolumn.grid(row=3, column=1, padx=2, sticky='WE') self.reactcoefcolumn.grid(row=3, column=2, padx=2, sticky='WE') self.reactnamecolumn.grid(row=3, column=3, padx=2, sticky='WE') self.reactformcolumn.grid(row=3, column=4, padx=2, sticky='WE') self.middlecolumn.grid(row=3, column=5, padx=2, sticky='WE') self.proddelcolumn.grid(row=3, column=6, padx=2, sticky='WE') self.prodcoefcolumn.grid(row=3, column=7, padx=2, sticky='WE') self.prodnamecolumn.grid(row=3, column=8, padx=2, sticky='WE') self.prodformcolumn.grid(row=3, column=9, padx=2, sticky='WE') self.prodblankcolumn.grid(row=3, column=10, padx=2, sticky='WE') self.reactlabel.grid(row=4, column=2, padx=2, sticky='WE', columnspan=3) self.prodlabel.grid(row=4, column=7, padx=2, sticky='WE', columnspan=3) self.reactcoeflabel.grid(row=5, column=2, padx=2, sticky='WE') self.reactnamelabel.grid(row=5, column=3, padx=2, sticky='WE') self.reactformlabel.grid(row=5, column=4, padx=2, sticky='WE') self.prodcoeflabel.grid(row=5, column=7, padx=2, sticky='WE') self.prodnamelabel.grid(row=5, column=8, padx=2, sticky='WE') self.prodformlabel.grid(row=5, column=9, padx=2, sticky='WE') self.updatereaction() # Build a frame for Reaction rate self.focusbutton = None def click_model(self, event=None): check = 0 reactant_list = [reactant.name.get() for reactant in self.reactants] for name in reactant_list: if reactant_list.count(name) > 1: check = 1 if len(self.reactants) == 0: tkmb.showerror( title=self.system.version, message='Please firstly input the information of reactants.') self.model.set('Fundamental') self.focusbutton = self.okbutton self.master.tk.lift() elif check == 1: tkmb.showerror( title=self.system.version, message= 'At least one chemical is replicated in the reactant list, please check' ) self.model.set('Fundamental') self.focusbutton = self.okbutton self.master.tk.lift() else: if self.model.get() == 'User-defined': if self.top is None: self.top = CapSimWindow(master=self.master, buttons=2) self.top.make_window( UserDefined(self.top, self.system, self.reactants)) self.top.tk.mainloop() if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror( title=self.system.version, message= 'Please close the existing parameter input window first.' ) self.top.tk.focus() self.updaterateequation() def updaterateequation(self): try: self.ratewidget.grid_forget() except: pass font = tkFont.Font(font=self.formulatype) subfont = tkFont.Font(font=self.subfont) superfont = tkFont.Font(font=self.superfont) if self.model.get() == 'Fundamental': rate_len = font.measure(u'r = \u03BB') for reactant in self.reactants: rate_len = rate_len + font.measure('C') rate_len = rate_len + subfont.measure(reactant.formula.get()) if reactant.coef.get() == int(reactant.coef.get()): coef = int(reactant.coef.get()) else: coef = reactant.coef.get() if coef <> 1.: rate_len = rate_len + superfont.measure(str(coef) + ' ') self.ratewidget = Text(self.frame, width=int(rate_len * 1.1424219345 / 8) + 1, height=1, font=self.formulatype) self.ratewidget.insert('end', u'r = \u03BB') for reactant in self.reactants: self.ratewidget.insert('end', 'C') self.ratewidget.insert('end', reactant.formula.get(), 'sub') if reactant.coef.get() == int(reactant.coef.get()): coef = int(reactant.coef.get()) else: coef = reactant.coef.get() if coef <> 1.: self.ratewidget.insert('end', str(coef) + ' ', 'super') if self.model.get() == 'User-defined': rate_len = font.measure(u'r = \u03BB') for reactant in self.reactants: if reactant.index.get() <> 0: rate_len = rate_len + font.measure('C') rate_len = rate_len + subfont.measure( reactant.formula.get()) if reactant.index.get() == int(reactant.index.get()): index = int(reactant.index.get()) else: index = reactant.index.get() if index <> 1.: rate_len = rate_len + superfont.measure( str(index) + ' ') self.ratewidget = Text(self.frame, width=int(rate_len * 1.1424219345 / 8) + 1, height=1, font=self.formulatype) self.ratewidget.insert('end', u'r = \u03BB') for reactant in self.reactants: if reactant.index.get() <> 0: self.ratewidget.insert('end', 'C') self.ratewidget.insert('end', reactant.formula.get(), 'sub') if reactant.index.get() == int(reactant.index.get()): index = int(reactant.index.get()) else: index = reactant.index.get() if index <> 1.: self.ratewidget.insert('end', str(index) + ' ', 'super') self.ratewidget.tag_config('sub', offset=-4, font=self.subfont) self.ratewidget.tag_config('super', offset=5, font=self.superfont) self.ratewidget.tag_config('right', justify='right') self.ratewidget.config(state='disabled', background=self.bgcolor, borderwidth=0, spacing3=3) self.ratewidget.grid(row=2, column=8, padx=2, sticky='W', columnspan=3) def updatereaction(self): try: self.addreactwidget.grid_forget() self.addprodwidget.grid_forget() self.okbutton.grid_forget() self.cancelbutton.grid_forget() except: pass self.updaterateequation() row = 6 for reactant in self.reactants: try: reactant.remove_propertieswidgets() except: pass reactant.propertieswidgets(self.frame, row, self.master, self.chemical_list, self.formula_list, self.MW_list) row = row + 1 row_reactant = row row = 6 for product in self.products: try: product.remove_propertieswidgets() except: pass product.propertieswidgets(self.frame, row, self.master, self.chemical_list, self.formula_list, self.MW_list) row = row + 1 if row < row_reactant: row = row_reactant self.blank1.grid(row=row) row = row + 1 self.addreactwidget.grid(row=row, columnspan=11) row = row + 1 self.addprodwidget.grid(row=row, columnspan=11) row = row + 1 self.okbutton.grid(row=row, columnspan=11) row = row + 1 self.cancelbutton.grid(row=row, columnspan=11) row = row + 1 self.blank2.grid(row=row) self.okbutton.bind('<Return>', self.OK) self.focusbutton = self.okbutton self.master.geometry() def addreactant(self): self.reactants.append(Reactant(len(self.reactants) + 1)) self.reactants[-1].coef = DoubleVar(value=1) self.reactants[-1].name = StringVar(value=self.chemical_list[0]) self.reactants[-1].formula = StringVar(value=self.formula_list[0]) self.reactants[-1].index = DoubleVar(value=1) self.reactants[-1].MW = DoubleVar(value=self.MW_list[0]) self.updatereaction() def addproduct(self): self.products.append(Product(len(self.products) + 1)) self.products[-1].coef = DoubleVar(value=1) self.products[-1].name = StringVar(value=self.chemical_list[0]) self.products[-1].formula = StringVar(value=self.formula_list[0]) self.products[-1].MW = StringVar(value=self.MW_list[0]) self.updatereaction() def delreactant(self, number): self.reactants[number - 1].remove_propertieswidgets() self.reactants.remove(self.reactants[number - 1]) self.updatereaction() def delproduct(self, number): self.products[number - 1].remove_propertieswidgets() self.products.remove(self.products[number - 1]) self.updatereaction() def OK(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.model.get() == 'Fundamental': for reactant in self.reactants: reactant.index.set(reactant.coef.get()) check = 0 chemicals = [] for reactant in self.reactants: chemicals.append(reactant.name.get()) for product in self.products: chemicals.append(product.name.get()) for chemical in chemicals: if chemicals.count(chemical) > 1: check = 1 if self.master.window.top is not None: self.master.open_toplevel() elif check == 1: self.reaction_error() else: for reactant in self.reactants: reactant.get_reactant() reactant.remove_propertieswidgets() for product in self.products: product.get_product() product.remove_propertieswidgets() if (len(self.reactants) + len(self.products)) == 0: self.cancelflag = 1 self.master.tk.quit() def reaction_error(self): tkmb.showerror( title=self.version, message='At least one chemical has been replicated in the reaction!' ) self.focusbutton = self.okbutton self.master.tk.lift() def Cancel(self): try: self.reactants = self.reaction.reactants self.products = self.reaction.products except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class LayerConditions: """Gets the chemical properties for each layer.""" def __init__(self, master, system): """Constructor method. Makes the GUI using the list of "Layer" objects "layers." """ self.master = master self.version = system.version self.fonttype = system.fonttype self.superfont = get_superfont(self.fonttype) self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.bgcolor = self.frame.cget('bg') self.top = None self.chemicals = system.chemicals self.layers = system.layers self.sorptions = system.sorptions self.matrices = system.matrices self.dep = system.dep self.CSTR_flag = 0 if system.dep == 'Deposition': matrix = system.matrices[system.layers[0].type_index] for chemical in self.chemicals: for component in matrix.components: if system.sorptions[component.name][ chemical. name].isotherm == 'Freundlich' or system.sorptions[ component.name][ chemical.name].isotherm == 'Langmuir': self.CSTR_flag = 1 elif system.sorptions[component.name][ chemical.name].kinetic == 'Transient': self.CSTR_flag = 1 self.topBCtypes = [ 'Fixed Concentration', 'Mass transfer', 'Finite mixed water column' ] self.botBCtypes = [ 'Fixed Concentration', 'Flux-matching', 'Zero Gradient' ] if system.adv == 'Steady flow' or system.adv == 'Tidal oscillation': self.U = system.Vdar else: self.U = 0 self.concunit = system.concunit self.lengthunit = system.lengthunit self.timeunit = system.timeunit try: self.bltype = system.bltype self.blcoefs = system.blcoefs except: self.bltype = 'River' self.blcoefs = {} self.blcoefs['vx'] = 1. self.blcoefs['n'] = 0.02 self.blcoefs['hriver'] = 5. self.blcoefs['rh'] = 5. self.blcoefs['nu'] = 1e-6 self.blcoefs['rhoair'] = 1. self.blcoefs['rhowater'] = 1000. self.blcoefs['vwind'] = 5. self.blcoefs['hlake'] = 10. self.blcoefs['llake'] = 1000. try: self.taucoefs = system.taucoefs except: self.taucoefs = {} self.taucoefs['Q'] = 1. self.taucoefs['V'] = 100. self.taucoefs['h'] = 1. self.taucoefs['DOC'] = 0. self.taucoefs['Qevap'] = 0. self.taucoefs['Decay'] = 'None' self.taucoefs['Evap'] = 'None' if system.ICs == None: self.ICs = {} for layer in system.layers: self.ICs[layer.name] = {} for chemical in self.chemicals: self.ICs[layer.name][chemical.name] = IC( layer.name, chemical.name) else: self.ICs = system.ICs if system.BCs == None: self.BCs = {} self.topBCtype = StringVar(value=self.topBCtypes[0]) self.botBCtype = StringVar(value=self.topBCtypes[0]) for chemical in self.chemicals: self.BCs[chemical.name] = BC(chemical.name, chemical.soluable) else: self.BCs = system.BCs self.topBCtype = StringVar(value=system.topBCtype) self.botBCtype = StringVar(value=system.botBCtype) self.lengthunits = system.lengthunits self.concunits = system.concunits self.timeunits = system.timeunits self.diffunits = system.diffunits self.lengthunit = system.lengthunit self.concunit = system.concunit self.timeunit = system.timeunit self.diffunit = system.diffunit self.diff_factor = 1. self.k_factor = 1. self.flux_factor = 0.001 if self.lengthunit == self.lengthunits[0]: self.diff_factor = self.diff_factor * (10000**2) self.k_factor = self.k_factor * 10000 self.flux_factor = self.flux_factor / (10000**2) elif self.lengthunit == self.lengthunits[2]: self.diff_factor = self.diff_factor / (100**2) self.k_factor = self.k_factor / 100 self.flux_factor = self.flux_factor * (100**2) if self.diffunit == system.diffunits[0]: if self.timeunit == self.timeunits[1]: self.diff_factor = self.diff_factor * 60 elif self.timeunit == self.timeunits[2]: self.diff_factor = self.diff_factor * 60 * 60 elif self.timeunit == self.timeunits[3]: self.diff_factor = self.diff_factor * 60 * 60 * 24 elif self.timeunit == self.timeunits[4]: self.diff_factor = self.diff_factor * 60 * 60 * 24 * 365.25 else: if self.timeunit == self.timeunits[0]: self.diff_factor = self.diff_factor / 365.25 / 24 / 60 / 60 elif self.timeunit == self.timeunits[1]: self.diff_factor = self.diff_factor / 365.25 / 24 / 60 elif self.timeunit == self.timeunits[2]: self.diff_factor = self.diff_factor / 365.25 / 24 elif self.timeunit == self.timeunits[3]: self.diff_factor = self.diff_factor / 365.25 def make_widgets(self): """Makes the widgets for the GUI.""" self.instructions = Label( self.frame, text= 'Please input the boundary conditions and initial concentration profiles: ' ) self.blank1 = Label(self.frame, text='') self.blank2 = Label(self.frame, text='') self.blankcolumn = Label(self.frame, width=2, text=' ') self.layercolumn = Label(self.frame, width=10, text=' ') self.typecolumn = Label(self.frame, width=24, text=' ') self.paracolumn = Label(self.frame, width=20, text=' ') self.unitcolumn = Label(self.frame, width=8, text=' ') self.endcolumn = Label(self.frame, width=4, text=' ') self.layerlabel = Label(self.frame, width=6, text=' ') self.typelabel = Label(self.frame, width=6, text='Type') self.paralabel = Label(self.frame, width=6, text='Parameter') self.unitlabel = Label(self.frame, width=6, text='Unit') self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') self.blank3 = Label(self.frame, text=' ') self.blank4 = Label(self.frame, text=' ') #show the widgets on the grid self.instructions.grid(row=0, column=0, padx=8, columnspan=6, sticky='W') self.blankcolumn.grid(row=1, column=0, sticky='WE', padx=1, pady=1) self.layercolumn.grid(row=1, column=1, sticky='WE', padx=1, pady=1) self.typecolumn.grid(row=1, column=2, sticky='WE', padx=1, pady=1) self.paracolumn.grid(row=1, column=3, sticky='WE', padx=1, pady=1) self.unitcolumn.grid(row=1, column=4, sticky='WE', padx=1, pady=1) self.layerlabel.grid(row=2, column=1, padx=4, sticky='WE') self.typelabel.grid(row=2, column=2, padx=4, sticky='WE') self.paralabel.grid(row=2, column=3, padx=4, sticky='WE') self.unitlabel.grid(row=2, column=4, padx=4, sticky='WE') column = 5 for chemical in self.chemicals: if chemical.soluable == 1: chemical.ICwidgets(self.frame, column) column = column + 1 self.endcolumn.grid(row=2, column=column, sticky='WE', padx=1, pady=1) self.updateconditions(event=1) self.focusbutton = None def updateBCs(self, event=None): self.updateconditions() def updateconditions(self, event=None, *args): try: self.topBClabel.grid_forget() self.topBCtwidget.grid_forget() self.botBClabel.grid_forget() self.botBCtwidget.grid_forget() self.blank3.grid_forget() self.blank4.grid_forget() except: pass try: self.Colabel.grid_forget() self.Counitlabel.grid_forget() except: pass try: self.klabel.grid_forget() self.kunitlabel.grid_forget() except: pass try: self.Cwlabel.grid_forget() self.Cwunitlabel.grid_forget() except: pass try: self.taulabel.grid_forget() self.tauunitlabel.grid_forget() except: pass try: self.Cblabel.grid_forget() self.Cbunitlabel.grid_forget() except: pass for chemical in self.chemicals: try: self.BCs[chemical.name].remove_widgets() except: pass for chemical in self.chemicals: self.BCs[chemical.name].topBCtype = self.topBCtype.get() self.BCs[chemical.name].botBCtype = self.botBCtype.get() row = 4 self.topblankrow_1 = Label(self.frame, width=1, text='') self.topblankrow_2 = Label(self.frame, width=1, text='') self.topblankrow_1.grid(row=4, column=0, padx=4, sticky='WE', pady=4, columnspan=1) self.topblankrow_2.grid(row=5, column=0, padx=4, sticky='WE', pady=4, columnspan=1) self.topBClabel = Label(self.frame, width=10, text='Benthic') self.topBCtwidget = OptionMenu(self.frame, self.topBCtype, *self.topBCtypes, command=self.updateBCs) self.topBClabel.grid(row=row, column=1, sticky='WE', padx=1, pady=1, rowspan=2) self.topBCtwidget.grid(row=row, column=2, sticky='WE', padx=1, pady=1, rowspan=2) if self.topBCtype.get() == self.topBCtypes[0]: self.Colabel = Label(self.frame, width=15, text='Surface concentration') self.Counitlabel = Label(self.frame, width=5, text=self.concunit) self.Colabel.grid(row=row, column=3, sticky='WE', padx=1, pady=1, rowspan=2) self.Counitlabel.grid(row=row, column=4, sticky='WE', padx=1, pady=1, rowspan=2) column = 5 for chemical in self.chemicals: if chemical.soluable == 1: self.BCs[chemical.name].topboundarywidget( self.frame, row, column) self.BCs[chemical.name].Co.trace('w', self.updateICs) column = column + 1 row = row + 2 if self.topBCtype.get() == self.topBCtypes[1]: self.klabel = Button(self.frame, width=15, text='Mass transfer coefficient', command=self.click_kbl) self.kunitlabel = Label( self.frame, width=5, text='cm/hr') #self.lengthunit + '/'+ self.timeunit) self.Cwlabel = Label(self.frame, width=15, text='Water concentration') self.Cwunitlabel = Label(self.frame, width=5, text=self.concunit) self.klabel.grid(row=row, column=3, sticky='WE', padx=1, pady=1) self.kunitlabel.grid(row=row, column=4, sticky='WE', padx=1, pady=1) self.Cwlabel.grid(row=row + 1, column=3, sticky='WE', padx=1, pady=1) self.Cwunitlabel.grid(row=row + 1, column=4, sticky='WE', padx=1, pady=1) column = 5 for chemical in self.chemicals: if chemical.soluable == 1: self.BCs[chemical.name].topboundarywidget( self.frame, row, column) self.BCs[chemical.name].Cw.trace('w', self.updateICs) column = column + 1 row = row + 2 if self.topBCtype.get() == self.topBCtypes[2]: if self.CSTR_flag == 0: self.klabel = Button(self.frame, width=15, text='Mass transfer coefficient', command=self.click_kbl) self.kunitlabel = Label(self.frame, width=5, text='cm/hr') self.taulabel = Button(self.frame, width=15, text='Water body retention time', command=self.click_tau) self.tauunitlabel = Label(self.frame, width=5, text=self.timeunit) self.klabel.grid(row=row, column=3, sticky='WE', padx=1, pady=0) self.kunitlabel.grid(row=row, column=4, sticky='WE', padx=1, pady=1) self.taulabel.grid(row=row + 1, column=3, sticky='WE', padx=1, pady=0) self.tauunitlabel.grid(row=row + 1, column=4, sticky='WE', padx=1, pady=1) column = 5 for chemical in self.chemicals: if chemical.soluable == 1: self.BCs[chemical.name].topboundarywidget( self.frame, row, column) column = column + 1 row = row + 2 else: tkmb.showerror( title='Model Error', message= 'The water body CSTR model is not applicable for systems with deposition layer governing by non-linear equilibrium isotherm or transient sorption kinetics' ) self.topBCtype.set(self.topBCtypes[1]) self.klabel = Button(self.frame, width=15, text='Mass transfer coefficient', command=self.click_kbl) self.kunitlabel = Label(self.frame, width=5, text='cm/hr') self.Cwlabel = Label(self.frame, width=15, text='Water concentration') self.Cwunitlabel = Label(self.frame, width=5, text=self.concunit) self.klabel.grid(row=row, column=3, sticky='WE', padx=1, pady=1) self.kunitlabel.grid(row=row, column=4, sticky='WE', padx=1, pady=1) self.Cwlabel.grid(row=row + 1, column=3, sticky='WE', padx=1, pady=1) self.Cwunitlabel.grid(row=row + 1, column=4, sticky='WE', padx=1, pady=1) column = 5 for chemical in self.chemicals: if chemical.soluable == 1: self.BCs[chemical.name].topboundarywidget( self.frame, row, column) column = column + 1 row = row + 2 if self.layers[0].name != 'Deposition': self.blank3.grid(row=row) row = row + 1 for layer in self.layers: row = row + 2 self.updateICs() self.blank4.grid(row=row) row = row + 1 self.botBClabel = Label(self.frame, width=10, text='Underlying') self.botBCtwidget = OptionMenu(self.frame, self.botBCtype, *self.botBCtypes, command=self.updateBCs) self.botBClabel.grid(row=row, column=1, sticky='WE', padx=1, pady=1) self.botBCtwidget.grid(row=row, column=2, sticky='WE', padx=1, pady=1) #print(self.botBCtype.get()) if self.botBCtype.get() == self.botBCtypes[0] or self.botBCtype.get( ) == self.botBCtypes[1]: self.Cblabel = Label(self.frame, width=15, text='Concentration') self.Cbunitlabel = Label(self.frame, width=5, text=self.concunit) self.Cblabel.grid(row=row, column=3, sticky='WE', padx=1, pady=1) self.Cbunitlabel.grid(row=row, column=4, sticky='WE', padx=1, pady=1) column = 5 for chemical in self.chemicals: if chemical.soluable == 1: self.BCs[chemical.name].botboundarywidget( self.frame, row, column) column = column + 1 row = row + 1 else: row = row + 1 self.blank1.grid(row=row) self.focusbutton = None self.frame.update() self.master.geometry() self.master.center() def updateICs(self, event=None, *args): for layer in self.layers: try: layer.remove_ICwidgets() except: pass for chemical in self.chemicals: try: self.ICs[layer.name][chemical.name].remove_widgets() except: pass if self.layers[0].name != 'Deposition': row = 7 else: row = 6 for layer in self.layers: layer.ICwidgets(self.frame, row, self.master, self.concunit) column = 5 for chemical in self.chemicals: if chemical.soluable == 1: self.ICs[layer.name][chemical.name].propertieswidgets( self.frame, row, column, layer.ICtype.get(), layer.name) column = column + 1 row = row + 2 if self.layers[0].name == 'Deposition': for chemical in self.chemicals: if chemical.soluable == 1: if self.topBCtype.get() == self.topBCtypes[0]: self.ICs[self.layers[0].name][ chemical.name].uniform.set( self.BCs[chemical.name].Co.get()) elif self.topBCtype.get() == self.topBCtypes[1]: self.ICs[self.layers[0].name][ chemical.name].uniform.set( self.BCs[chemical.name].Cw.get()) elif self.topBCtype.get() == self.topBCtypes[2]: self.ICs[self.layers[0].name][ chemical.name].uniform.set('Cw') def click_kbl(self, event=None): if self.top is None: self.top = CapSimWindow(master=self.master, buttons=2) self.top.make_window( KblEstimator(self.top, self.version, self.fonttype, self.bltype, self.blcoefs)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.bltype = self.top.window.bltype.get() if self.top.window.bltype.get() == 'River': self.blcoefs['vx'] = self.top.window.vx.get() self.blcoefs['n'] = self.top.window.n.get() self.blcoefs['hriver'] = self.top.window.hriver.get() self.blcoefs['rh'] = self.top.window.rh.get() self.blcoefs['nu'] = self.top.window.nu.get() for chemical in self.chemicals: if chemical.soluable == 1: try: self.BCs[chemical.name].k.set( round_to_n( kblriver( self.blcoefs['vx'], self.blcoefs['n'], self.blcoefs['hriver'], self.blcoefs['rh'], self.blcoefs['nu'], chemical.Dw / 86400 / 365 * self.diff_factor), 3)) except: tkmb.showerror( title='Math Error', message= 'The parameters you have entered produce a math error. Please change the parameters and recalculate.' ) else: self.blcoefs['rhoair'] = self.top.window.rhoair.get() self.blcoefs['rhowater'] = self.top.window.rhowater.get() self.blcoefs['vwind'] = self.top.window.vwind.get() self.blcoefs['hlake'] = self.top.window.hlake.get() self.blcoefs['llake'] = self.top.window.llake.get() for chemical in self.chemicals: if chemical.soluable == 1: try: self.BCs[chemical.name].k.set( round_to_n( kbllake(self.blcoefs['rhoair'], self.blcoefs['rhowater'], self.blcoefs['vwind'], self.blcoefs['hlake'], chemical.MW, self.blcoefs['llake']), 3)) except: tkmb.showerror( title='Math Error', message= 'The parameters you have entered produce a math error. Please change the parameters and recalculate.' ) if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror( title=self.version, message= 'Please close the existing parameter input window first.') self.top.tk.focus() self.updateconditions() def click_tau(self, event=None): if self.top is None: self.top = CapSimWindow(master=self.master, buttons=2) self.top.make_window( TauEstimator(self.top, self.version, self.fonttype, self.timeunit, self.lengthunit, self.chemicals, self.taucoefs, self.BCs)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.taucoefs['Q'] = self.top.window.Q.get() self.taucoefs['V'] = self.top.window.V.get() self.taucoefs['h'] = self.top.window.h.get() self.taucoefs['Qevap'] = self.top.window.Qevap.get() self.taucoefs['DOC'] = self.top.window.doc.get() self.taucoefs['Decay'] = self.top.window.Decay.get() self.taucoefs['Evap'] = self.top.window.Evap.get() Q = self.taucoefs['Q'] - self.taucoefs[ 'Qevap'] + self.taucoefs['V'] / self.taucoefs['h'] * self.U if self.dep == 'Deposition': if self.lengthunit == 'cm': kdep = self.layers[0].h / 100 elif self.lengthunit == u'\u03BCm': kdep = self.layers[0].h / 100 / 1000 else: kdep = self.layers[0].h matrix = self.matrices[self.layers[0].type_index] epsilon = self.matrices[self.layers[0].type_index].e dep_rho = matrix.rho dep_fraction = [] for component in matrix.components: dep_fraction.append(component.mfraction) else: kdep = 0 epsilon = 0 dep_rho = 0 dep_fraction = [] for n in range(len(self.chemicals)): chemical = self.chemicals[n] self.BCs[chemical.name].kdecay = self.top.window.kdecays[n] self.BCs[chemical.name].kevap = self.top.window.kevaps[n] if self.taucoefs['Evap'] == 'None': kevap = 0 else: kevap = self.top.window.kevaps[n] if self.taucoefs['Decay'] == 'None': kdecay = 0 else: kdecay = self.top.window.kdecays[n] K = [] if self.dep == 'Deposition': matrix = self.matrices[self.layers[0].type_index] for component in matrix.components: if self.sorptions[component.name][ chemical. name].isotherm == 'Linear--Kd specified': K.append(self.sorptions[component.name][ chemical.name].K) elif self.sorptions[component.name][ chemical. name].isotherm == 'Linear--Kocfoc': K.append(10**self.sorptions[component.name][ chemical.name].Koc) try: self.BCs[chemical.name].tau.set( round_to_n( tauwater(Q, self.taucoefs['DOC'], chemical.Kdoc, kdep, epsilon, dep_rho, dep_fraction, K, self.taucoefs['V'], self.taucoefs['h'], kevap, kdecay), 3)) except: tkmb.showerror( title='Math Error', message= 'The parameters you have entered produce a math error. Please change the parameters and recalculate.' ) if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror( title=self.version, message= 'Please close the existing parameter input window first.') self.top.tk.focus() self.updateconditions() def error_check(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" error = 0 if self.topBCtype.get() == 'Finite mixed water column': for chemical in self.chemicals: if self.BCs[chemical.name].tau.get() <= 0: error = 1 return error def warning(self): tkmb.showerror(title=self.version, message='The retention time must be positive values') self.focusbutton = None self.master.tk.lift()
class ReactionDeleter: """Gets the chemical reaction information for each layer.""" def __init__(self, master, system, reaction): """Constructor method. Makes the GUI using the list of "Layer" objects "layers." """ self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.bgcolor = self.frame.cget('bg') self.top = None self.number = reaction.number self.name = reaction.name self.equation = reaction.equation self.cancelflag = 0 def make_widgets(self): self.instructions = Label( self.frame, text= ' Are you sure to delete the following reaction? ' ) self.blankcolumn = Label(self.frame, text=' ', width=1) self.numbercolumn = Label(self.frame, text=' ', width=5) self.namecolumn = Label(self.frame, text=' ', width=15) self.equationcolumn = Label(self.frame, text=' ', width=50) self.numberlabel = Label(self.frame, text='Number') self.namelabel = Label(self.frame, text='Name') self.equationlabel = Label(self.frame, text='Chemical equation') self.numberwidget = Label(self.frame, text=self.number) self.namewidget = Label(self.frame, text=self.name) self.equationwidget = Label(self.frame, text=self.equation, font='Calibri 11') self.instructions.grid(row=0, column=1, sticky='WE', padx=1, pady=1, columnspan=4) self.blankcolumn.grid(row=1, column=0, sticky='WE', padx=1, pady=1) self.numbercolumn.grid(row=1, column=1, sticky='WE', padx=1, pady=1) self.namecolumn.grid(row=1, column=2, sticky='WE', padx=1, pady=1) self.equationcolumn.grid(row=1, column=3, sticky='WE', padx=1, pady=1) self.numberlabel.grid(row=2, column=1, sticky='WE', padx=1, pady=1) self.namelabel.grid(row=2, column=2, sticky='WE', padx=1, pady=1) self.equationlabel.grid(row=2, column=3, sticky='WE', padx=1, pady=1) self.numberwidget.grid(row=3, column=1, sticky='WE', padx=1, pady=1) self.namewidget.grid(row=3, column=2, sticky='WE', padx=1, pady=1) self.equationwidget.grid(row=3, column=3, sticky='WE', padx=1, pady=1) self.deletebutton = Button(self.frame, text='Delete', width=20, command=self.Delete) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.Cancel) self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') self.blank1.grid(row=4) self.deletebutton.grid(row=5, columnspan=4) self.cancelbutton.grid(row=6, columnspan=4) self.blank2.grid(row=7) self.deletebutton.bind('<Return>', self.Delete) self.focusbutton = self.deletebutton def Delete(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit() def Cancel(self): self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class ChemicalDeleter: def __init__(self, master, system, chemical): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) #superscript font self.frame = Frame(master.frame) self.tframe = Frame(master.tframe) self.bframe = Frame(master.bframe) self.top = None #flag for existence of toplevel# self.soluableflag = chemical.soluable self.name = StringVar(value=chemical.name) self.MW = DoubleVar(value=chemical.MW) self.formula = StringVar(value=chemical.formula) self.temp = DoubleVar(value=chemical.temp) self.Dw = DoubleVar(value=chemical.Dw) self.Koc = DoubleVar(value=chemical.Koc) self.Kdoc = DoubleVar(value=chemical.Kdoc) self.Ref = StringVar(value=chemical.Ref) self.Kf = DoubleVar(value=chemical.Kf) self.N = DoubleVar(value=chemical.N) self.chemical = chemical self.cancelflag = 0 def make_widgets(self): self.bgcolor = self.frame.cget('bg') self.instructions = Label( self.frame, text= ' Are you sure to delete the following chemical? ' ) self.namelabel = Label(self.frame, text='Chemical name') self.MWlabel = Label(self.frame, text='Molecular\n weight') self.templabel = Label(self.frame, text='Temperature') self.Dwlabel = Label(self.frame, text='Molecular diffusivity\n in water') self.Koclabel = Label(self.frame, text='Organic carbon\n partition coefficient') self.Kdoclabel = Label( self.frame, text='Dissolved organic carbon\n partition coefficient') self.Reflabel = Label(self.frame, text='Reference') self.tempunits = Label(self.frame, text=unichr(176) + 'C') self.Dwunits = Label(self.frame, text=u'cm\u00B2/s') self.Kocunits = Label(self.frame, text='log(L/kg)') self.Kdocunits = Label(self.frame, text='log(L/kg)') self.namewidget = Label(self.frame, width=20, justify='center', textvariable=self.name) if self.soluableflag == 1: self.tempwidget = Label(self.frame, width=10, justify='center', textvariable=self.temp) self.MWwidget = Label(self.frame, width=16, justify='center', textvariable=self.MW) self.Dwwidget = Label(self.frame, width=16, justify='center', textvariable=self.Dw) self.Kocwidget = Label(self.frame, width=16, justify='center', textvariable=self.Koc) self.Kdocwidget = Label(self.frame, width=16, justify='center', textvariable=self.Kdoc) self.Refwidget = Label(self.frame, width=16, justify='center', textvariable=self.Ref) else: self.tempwidget = Label(self.frame, width=10, justify='center', text=' ') self.Dwwidget = Label(self.frame, width=16, justify='center', text='Not applicable') self.Kocwidget = Label(self.frame, width=16, justify='center', text='Not applicable') self.Kdocwidget = Label(self.frame, width=16, justify='center', text='Not applicable') self.insoluablestate = Label(self.frame, width=16, justify='center', text='Not applicable') #show the widgets on the grid self.blankcolumn = Label(self.frame, text=' ', width=2) self.namecolumn = Label(self.frame, text=' ', width=20) self.MWcolumn = Label(self.frame, text=' ', width=18) self.tempcolumn = Label(self.frame, text=' ', width=10) self.Dwcolumn = Label(self.frame, text=' ', width=18) self.Koccolumn = Label(self.frame, text=' ', width=18) self.Kdoccolumn = Label(self.frame, text=' ', width=18) self.Refcolumn = Label(self.frame, text=' ', width=18) self.deletebutton = Button(self.frame, text='Delete', width=20, command=self.Delete) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.Cancel) self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') self.instructions.grid(row=0, column=0, columnspan=6, padx=8, sticky='W') self.blankcolumn.grid(row=1, column=0, sticky='WE', padx=1, pady=1) self.namecolumn.grid(row=1, column=1, sticky='WE', padx=1, pady=1) self.MWcolumn.grid(row=1, column=2, sticky='WE', padx=1, pady=1) self.tempcolumn.grid(row=1, column=3, sticky='WE', padx=1, pady=1) self.Dwcolumn.grid(row=1, column=4, sticky='WE', padx=1, pady=1) self.Koccolumn.grid(row=1, column=5, sticky='WE', padx=1, pady=1) self.Kdoccolumn.grid(row=1, column=6, sticky='WE', padx=1, pady=1) self.Refcolumn.grid(row=1, column=7, sticky='WE', padx=1, pady=1) self.namelabel.grid(row=2, column=1, sticky='WE', padx=4, pady=1) self.MWlabel.grid(row=2, column=2, sticky='WE', padx=1, pady=1) self.templabel.grid(row=2, column=3, sticky='WE', padx=1, pady=1) self.Dwlabel.grid(row=2, column=4, sticky='WE', padx=1, pady=1) self.Koclabel.grid(row=2, column=5, sticky='WE', padx=1, pady=1) self.Kdoclabel.grid(row=2, column=6, sticky='WE', padx=1, pady=1) self.Reflabel.grid(row=2, column=7, sticky='WE', padx=1, pady=1) self.tempunits.grid(row=3, column=3, sticky='WE', padx=1, pady=1) self.Dwunits.grid(row=3, column=4, sticky='WE', padx=1, pady=1) self.Kocunits.grid(row=3, column=5, sticky='WE', padx=1, pady=1) self.Kdocunits.grid(row=3, column=6, sticky='WE', padx=1, pady=1) self.namewidget.grid(row=4, column=1, padx=2, pady=1, sticky='WE') self.MWwidget.grid(row=4, column=2, padx=2, pady=1, sticky='WE') self.tempwidget.grid(row=4, column=3, padx=2, pady=1, sticky='WE') self.Dwwidget.grid(row=4, column=4, padx=2, pady=1) self.Kocwidget.grid(row=4, column=5, padx=2, pady=1) self.Kdocwidget.grid(row=4, column=6, padx=2, pady=1) self.Refwidget.grid(row=4, column=7, padx=2, pady=1) self.blank1.grid(row=5) self.deletebutton.grid(row=6, columnspan=11) self.cancelbutton.grid(row=7, columnspan=11) self.blank2.grid(row=8) self.deletebutton.bind('<Return>', self.Delete) self.focusbutton = self.deletebutton def Delete(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit() def Cancel(self): try: self.name.set(self.chemical.name) self.temp.set(self.chemical.temp) self.MW.set(self.chemical.MW) self.formula.set(self.chemical.formula) self.Dw.set(self.chemical.Dw) self.Koc.set(self.chemical.Koc) self.Kdoc.set(self.chemical.Kdoc) self.Ref.set(self.chemical.Ref) self.Kf.set(self.chemical.Kf) self.N.set(self.chemical.N) except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class SorptionEditor: """Gets the contaminant properties.""" def __init__(self, master, system, sorption): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.fonttype = system.fonttype self.version = system.version self.sfont = get_superfont(self.fonttype) #superscript font self.frame = Frame(master.frame) self.tframe = Frame(master.tframe) self.bframe = Frame(master.bframe) self.top = None #flag for existence of toplevel# self.system = system self.isotherms = ['Linear--Kd specified', 'Linear--Kocfoc', 'Freundlich', 'Langmuir'] self.kinetics = ['Equilibrium', 'Transient'] self.sorption = sorption self.isotherm = StringVar(value = sorption.isotherm) self.kinetic = StringVar(value = sorption.kinetic) self.K = DoubleVar(value = sorption.K) self.Koc = DoubleVar(value = sorption.Koc) self.Kf = DoubleVar(value = sorption.Kf) self.N = DoubleVar(value = sorption.N) self.qmax = DoubleVar(value = sorption.qmax) self.b = DoubleVar(value = sorption.b) self.ksorp = DoubleVar(value = sorption.ksorp) self.cinit = sorption.cinit self.qinit = sorption.qinit self.thalf = sorption.thalf self.concunit = system.concunit self.timeunit = system.timeunit self.tkfont = tkFont.Font(font = self.fonttype) self.cancelflag = 0 def make_widgets(self): """Make the widgets for the window.""" self.bgcolor = self.frame.cget('bg') self.instructions = Label(self.frame, text = ' Please provide the following sorption properties: ') self.leftcolumn = Label(self.frame, width = 2, text = '' ) self.matrixcolumn = Label(self.frame, width = 10, text = '' ) self.chemicalcolumn = Label(self.frame, width = 10, text = '' ) self.isothermcolumn = Label(self.frame, width = 20, text = '' ) self.kineticcolumn = Label(self.frame, width = 15, text = '' ) self.equacolumn = Label(self.frame, width = 17, text = '' ) self.coefcolumn1 = Label(self.frame, width = 6, text = '' ) self.coefcolumn2 = Label(self.frame, width = 9, text = '' ) self.coefcolumn3 = Label(self.frame, width = int(self.tkfont.measure(self.concunit[:-1]+'/kg/('+ self.concunit +')'+ u'\u1d3a')/8)+1, text = '' ) self.coefcolumn4 = Label(self.frame, width = 4, text = '' ) self.coefcolumn5 = Label(self.frame, width = 9, text = '' ) self.coefcolumn6 = Label(self.frame, width = int(self.tkfont.measure(self.concunit)/8)+1, text = '' ) self.coefcolumn7 = Label(self.frame, width = 7, text = '' ) self.coefcolumn8 = Label(self.frame, width = 9, text = '' ) self.coefcolumn9 = Label(self.frame, width = 10, text = '' ) self.rightcolumn = Label(self.frame, width = 2, text = '' ) self.matrixlabel = Label(self.frame, text = 'Matrix') self.chemicallabel = Label(self.frame, text = 'Chemical') self.isothermlabel = Label(self.frame, text = 'Sorption Isotherm') self.kineticlabel = Label(self.frame, text = 'Kinetics') self.matrixwidget = Label(self.frame, text = self.sorption.matrix.name) self.chemicalwidget = Label(self.frame, text = self.sorption.chemical.name) self.isothermwidget = OptionMenu(self.frame, self.isotherm, *self.isotherms, command = self.click_isotherm) self.kineticwidget = OptionMenu(self.frame, self.kinetic, *self.kinetics, command = self.click_kinetic) self.okbutton = Button(self.frame, text = 'OK', width = 20, command = self.OK) self.cancelbutton = Button(self.frame, text = 'Cancel', width = 20, command = self.Cancel) self.blank1 = Label(self.frame, text = ' ') self.blank2 = Label(self.frame, text = ' ') #show the widgets on the grid self.instructions.grid(row = 0, column = 0, columnspan = 15, padx = 2, pady = 8, sticky = 'W') self.leftcolumn.grid( row = 1, column = 0, padx = 2, pady = 1, sticky = 'WE') self.matrixcolumn.grid( row = 1, column = 1, padx = 2, pady = 1, sticky = 'WE') self.chemicalcolumn.grid(row = 1, column = 2, padx = 2, pady = 1, sticky = 'WE') self.isothermcolumn.grid(row = 1, column = 3, padx = 2, pady = 1, sticky = 'WE') self.kineticcolumn.grid( row = 1, column = 4, padx = 2, pady = 1, sticky = 'WE') self.equacolumn.grid( row = 1, column = 5, padx = 2, pady = 1, sticky = 'WE') self.coefcolumn1.grid( row = 1, column = 6, padx = 0, pady = 1) self.coefcolumn2.grid( row = 1, column = 7, padx = 0, pady = 1) self.coefcolumn3.grid( row = 1, column = 8, padx = 0, pady = 1) self.coefcolumn4.grid( row = 1, column = 9, padx = 0, pady = 1) self.coefcolumn5.grid( row = 1, column = 10, padx = 0, pady = 1) self.coefcolumn6.grid( row = 1, column = 11, padx = 0, pady = 1) self.coefcolumn7.grid( row = 1, column = 12, padx = 0, pady = 1) self.coefcolumn8.grid( row = 1, column = 13, padx = 0, pady = 1) self.coefcolumn9.grid( row = 1, column = 14, padx = 0, pady = 1) self.rightcolumn.grid( row = 1, column = 15, padx = 0, pady = 1) self.matrixlabel.grid( row = 2, column = 1, padx = 2, pady = 4, sticky = 'WE') self.chemicallabel.grid( row = 2, column = 2, padx = 2, pady = 4, sticky = 'WE') self.isothermlabel.grid( row = 2, column = 3, padx = 2, pady = 4, sticky = 'WE') self.kineticlabel.grid( row = 2, column = 4, padx = 2, pady = 4, sticky = 'WE') self.matrixwidget.grid( row = 3, column = 1, padx = 2, pady = 1, sticky = 'WE') self.chemicalwidget.grid(row = 3, column = 2, padx = 2, pady = 1, sticky = 'WE') self.isothermwidget.grid(row = 3, column = 3, padx = 2, pady = 1, sticky = 'WE') self.kineticwidget.grid( row = 3, column = 4, padx = 2, pady = 1, sticky = 'WE') self.blank1.grid( row = 4) self.okbutton.grid( row = 5, columnspan = 15) self.cancelbutton.grid( row = 6, columnspan = 15) self.blank2.grid( row = 7) self.okbutton.bind('<Return>', self.OK) self.focusbutton = self.okbutton self.click_isotherm() self.click_kinetic() def click_kinetic(self, event = None): bgcolor = self.frame.cget('bg') try: self.klabel.grid_forget() self.ksorplabel.grid_forget() self.ksorpwidget.grid_forget() self.ksorpunits.grid_forget() except: pass if self.kinetic.get() == self.kinetics[1]: if self.isotherm.get() == self.isotherms[3]: self.klabel = Label(self.frame, text = 'Kinetic rate coefficient:') else: self.klabel = Button(self.frame, text = 'Kinetic rate coefficient:', command = self.k_estimator) self.ksorplabel = Text(self.frame, width = 7, height = 1) self.ksorplabel.insert('end', u'k') self.ksorplabel.insert('end', 'sorp', 'sub') self.ksorplabel.insert('end', u' =') self.ksorplabel.tag_config('sub', offset = -2, font = 'Arial 8') self.ksorplabel.tag_config('right', justify = 'right') self.ksorplabel.config(state = 'disabled', background = bgcolor, borderwidth = 0, spacing3 = 3) self.ksorpwidget = Entry(self.frame, textvariable = self.ksorp, justify = 'center', width = 10) if self.isotherm.get() == self.isotherms[0] or self.isotherm.get() == self.isotherms[1]: self.ksorpunits = Label(self.frame, text = self.timeunit +u'\u207B\u00b9') if self.isotherm.get() == self.isotherms[2]: self.ksorpunits = Label(self.frame, text = self.timeunit +u'\u207B\u00b9') if self.isotherm.get() == self.isotherms[3]: self.ksorpunits = Label(self.frame, text = '(' + self.concunit[:-1] +'kg)'+u'\u207B\u00b9 ' +self.timeunit + u'\u207B\u00b9') self.klabel.grid( row = 2, column = 12, padx = 1, pady = 1, sticky = 'WE', columnspan = 3) self.ksorplabel.grid( row = 3, column = 12, padx = 1, pady = 5, sticky = 'SE') self.ksorpwidget.grid(row = 3, column = 13, padx = 1, pady = 1) self.ksorpunits.grid( row = 3, column = 14, padx = 1, sticky = 'W') def k_estimator(self, event = None): k_error = 0 coef = [] coef.append(self.cinit) coef.append(self.qinit) coef.append(self.thalf) coef.append(self.ksorp.get()) if self.isotherm.get() == self.isotherms[0]: coef.append(self.K.get()) coef.append(0) if self.K.get() == 0: K_error = 1 if self.isotherm.get() == self.isotherms[1]: coef.append(self.Koc.get()) coef.append(self.sorption.matrix.foc) if self.Koc.get() == 0: K_error = 1 if self.isotherm.get() == self.isotherms[2]: coef.append(self.Kf.get()) coef.append(self.N.get()) if self.Kf.get() == 0 or self.N.get() == 0: K_error = 1 if self.isotherm.get() == self.isotherms[3]: coef.append(self.qmax.get()) coef.append(self.b.get()) if self.qmax.get() == 0 or self.b.get() == 0: K_error = 1 coef.append(self.sorption.matrix.e) coef.append(self.sorption.matrix.rho) if self.top is None: self.top = CapSimWindow(master = self.master, buttons = 2) self.top.make_window(K_Estimator(self.top, self.system, self.isotherm.get(), coef)) self.top.tk.mainloop() if self.top.window.cancelflag == 0: self.ksorp.set(self.top.window.ksorp.get()) self.cinit = self.top.window.cinit.get() self.qinit = self.top.window.qinit.get() self.thalf = self.top.window.thalf.get() if self.top is not None: self.top.destroy() self.top = None elif self.top is not None: tkmb.showerror(title = self.version, message = 'Please close the existing parameter input window first.') self.top.tk.focus() def click_isotherm(self, event = None): try: self.equalabel.grid_forget() self.coeflabel.grid_forget() self.eqwidget.grid_forget() except: pass try: self.Klabel.grid_forget() self.Kwidget.grid_forget() self.Kunits.grid_forget() except: pass try: self.Koclabel.grid_forget() self.Kocwidget.grid_forget() self.Kocunits.grid_forget() except: pass try: self.Kflabel.grid_forget() self.Nlabel.grid_forget() self.Kfwidget.grid_forget() self.Nwidget.grid_forget() self.Kfunits.grid_forget() except: pass try: self.qmaxlabel.grid_forget() self.qmaxwidget.grid_forget() self.qmaxunits.grid_forget() self.blabel.grid_forget() self.bwidget.grid_forget() self.bunits.grid_forget() except: pass bgcolor = self.frame.cget('bg') if self.isotherm.get() == self.isotherms[0]: self.equalabel = Label(self.frame, text = 'Isotherm Equation') self.eqwidget = Text(self.frame, width = 7, height = 1) self.eqwidget.insert('end', u'q = K') self.eqwidget.insert('end', 'd', 'sub') self.eqwidget.insert('end', 'C') self.eqwidget.tag_config('sub', offset = -2, font = 'Arial 8') self.eqwidget.tag_config('right', justify = 'center') self.eqwidget.config(state = 'disabled', background = bgcolor, borderwidth = 0, spacing3 = 3) self.coeflabel = Label(self.frame, text = 'Matrix-water partition coefficient') self.Klabel = Text(self.frame, width = 4, height = 1) self.Klabel.insert('end', 'K') self.Klabel.insert('end', 'd', 'sub') self.Klabel.insert('end', ' =') self.Klabel.tag_config('sub', offset = -2, font = 'Arial 8') self.Klabel.tag_config('right', justify = 'right') self.Klabel.config(state = 'disabled', background = bgcolor, borderwidth = 0, spacing3 = 3) self.Kwidget = Entry(self.frame, textvariable = self.K, justify = 'center', width = 10) self.Kunits = Label(self.frame, text = 'L/kg') self.equalabel.grid( row = 2, column = 5, padx = 2, pady = 1, sticky = 'WE') self.coeflabel.grid( row = 2, column = 6, padx = 2, pady = 1, sticky = 'WE', columnspan = 6) self.eqwidget.grid( row = 3, column = 5, padx = 1, pady = 5, sticky = 'S') self.Klabel.grid( row = 3, column = 6, padx = 0, pady = 5, sticky = 'SE') self.Kwidget.grid( row = 3, column = 7, padx = 0) self.Kunits.grid( row = 3, column = 8, padx = 0, sticky = 'W') elif self.isotherm.get() == self.isotherms[1]: self.equalabel = Label(self.frame, text = 'Isotherm Equation') self.eqwidget = Text(self.frame, width = 10, height = 1) self.eqwidget.insert('end', u'q = K') self.eqwidget.insert('end', 'oc', 'sub') self.eqwidget.insert('end', 'f') self.eqwidget.insert('end', 'oc', 'sub') self.eqwidget.insert('end', 'C') self.eqwidget.tag_config('sub', offset = -2, font = 'Arial 8') self.eqwidget.tag_config('right', justify = 'right') self.eqwidget.config(state = 'disabled', background = bgcolor, borderwidth = 0, spacing3 = 3) self.coeflabel = Label(self.frame, text = 'Organic carbon partition coefficient:') self.Koclabel = Text(self.frame, width = 5, height = 1) self.Koclabel.insert('end', 'K') self.Koclabel.insert('end', 'oc', 'sub') self.Koclabel.insert('end', ' =') self.Koclabel.tag_config('sub', offset = -2, font = 'Arial 8') self.Koclabel.tag_config('right', justify = 'right') self.Koclabel.config(state = 'disabled', background = bgcolor, borderwidth = 0, spacing3 = 3) self.Kocwidget = Entry(self.frame, textvariable = self.Koc, justify = 'center', width = 10) self.Kocunits = Label(self.frame, text = 'log(L/kg)') self.equalabel.grid( row = 2, column = 5, padx = 2, pady = 1, sticky = 'WE') self.coeflabel.grid( row = 2, column = 6, padx = 2, pady = 1, sticky = 'WE', columnspan = 6) self.eqwidget.grid( row = 3, column = 5, padx = 1, pady = 5, sticky = 'S') self.Koclabel.grid ( row = 3, column = 6, padx = 0, pady = 5, sticky = 'SE') self.Kocwidget.grid( row = 3, column = 7, padx = 0) self.Kocunits.grid( row = 3, column = 8, padx = 0, sticky = 'W') elif self.isotherm.get() == self.isotherms[2]: self.equalabel = Label(self.frame, text = 'Isotherm Equation') self.eqwidget = Text(self.frame, width = 8, height = 1) self.eqwidget.insert('end', u'q = K') self.eqwidget.insert('end', 'F', 'sub') self.eqwidget.insert('end', 'C') self.eqwidget.insert('end', 'N', 'super') self.eqwidget.tag_config('sub', offset = -2, font = 'Arial 8') self.eqwidget.tag_config('super', offset = 5, font = self.sfont) self.eqwidget.tag_config('right', justify = 'right') self.eqwidget.config(state = 'disabled', background = bgcolor, borderwidth = 0, spacing3 = 3) self.coeflabel = Label(self.frame, text = 'Freudlich isotherm coefficient:') self.Kflabel = Text(self.frame, width = 4, height = 1) self.Kflabel.insert('end', u'K') self.Kflabel.insert('end', 'F', 'sub') self.Kflabel.insert('end', u' =') self.Kflabel.tag_config('sub', offset = -2, font = 'Arial 8') self.Kflabel.tag_config('right', justify = 'right') self.Kflabel.config(state = 'disabled', background = bgcolor, borderwidth = 0, spacing3 = 3) self.Nlabel = Label(self.frame, text = 'N =') self.Kfwidget = Entry(self.frame, textvariable = self.Kf,justify = 'center', width = 10) self.Nwidget = Entry(self.frame, textvariable = self.N, justify = 'center', width = 10) self.Kfunits = Label(self.frame, text = self.concunit[:-1]+'/kg/('+ self.concunit +')'+ u'\u1d3a') self.equalabel.grid( row = 2, column = 5, padx = 2, pady = 1, sticky = 'WE') self.coeflabel.grid( row = 2, column = 6, padx = 2, pady = 1, sticky = 'WE', columnspan = 6) self.eqwidget.grid( row = 3, column = 5, padx = 1, pady = 5, sticky = 'S') self.Kflabel.grid( row = 3, column = 6, padx = 0, pady = 5, sticky = 'SE') self.Kfwidget.grid( row = 3, column = 7, padx = 0) self.Kfunits.grid( row = 3, column = 8, padx = 0, sticky = 'W') self.Nlabel.grid ( row = 3, column = 9, padx = 0, sticky = 'E') self.Nwidget.grid( row = 3, column = 10, padx = 0) elif self.isotherm.get() == self.isotherms[3]: self.equalabel = Label(self.frame, text = 'Isotherm Equation') self.eqwidget = Text(self.frame, width = 17, height = 0.1) self.eqwidget.insert('end', u'q = q') self.eqwidget.insert('end', 'max', 'sub') self.eqwidget.insert('end', 'b*C/(1+b*C)') self.eqwidget.tag_config('sub', offset = -2, font = 'Arial 8') self.eqwidget.tag_config('right', justify = 'right') self.eqwidget.config(state = 'disabled', background = bgcolor, borderwidth = 0, spacing3 = 3) self.coeflabel = Label(self.frame, text = 'Langmuir isotherm coefficient:') self.qmaxlabel = Text(self.frame, width = 7, height = 0.1) self.qmaxlabel.insert('end', ' ', 'sub') self.qmaxlabel.insert('end', u'q') self.qmaxlabel.insert('end', 'max', 'sub') self.qmaxlabel.insert('end', u' =') self.qmaxlabel.tag_config('sub', offset = -3, font = 'Arial 8') self.qmaxlabel.tag_config('right', justify = 'right') self.qmaxlabel.config(state = 'disabled', background = bgcolor, borderwidth = 0, spacing3 = 3) self.qmaxwidget = Entry(self.frame, textvariable = self.qmax, justify = 'center', width = 10) self.qmaxunits = Label(self.frame, text = self.concunit[:-1] + 'kg') self.blabel = Label(self.frame, text = 'b =') self.bwidget = Entry(self.frame, textvariable = self.b, justify = 'center', width = 10) self.bunits = Label(self.frame, text = 'L/' + self.concunit[:-2]) self.equalabel.grid( row = 2, column = 5, padx = 2, pady = 1, sticky = 'WE') self.coeflabel.grid( row = 2, column = 6, padx = 2, pady = 1, sticky = 'WE', columnspan = 6) self.eqwidget.grid( row = 3, column = 5, padx = 1, pady = 5, sticky = 'S') self.qmaxlabel.grid( row = 3, column = 6, padx = 0, pady = 5, sticky = 'SE') self.qmaxwidget.grid( row = 3, column = 7, padx = 0, pady = 1) self.qmaxunits.grid( row = 3, column = 8, padx = 0, pady = 1, sticky = 'W') self.blabel.grid( row = 3, column = 9, padx = 0, pady = 1, sticky = 'E') self.bwidget.grid( row = 3, column = 10, padx = 0, pady = 1) self.bunits.grid( row = 3, column = 11, padx = 0, pady = 1, sticky = 'W') self.click_kinetic() def OK(self, event = None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit() def Cancel(self): try: self.isotherm.set(self.sorption.isotherm) self.kinetic.set(self.sorption.kinetic) self.K.set(self.sorption.K) self.Koc.set(self.sorption.Koc) self.Kf.set(self.sorption.Kf) self.N.set(self.sorption.N) self.qmax.set(self.sorption.qmax) self.b.set(self.sorption.b) self.ksorp.set(self.sorption.ksorp) except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class SolidDatabaseDeleter: def __init__(self, master, system, solid): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) #superscript font self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.top = None #flag for existence of toplevel# self.name = StringVar(value=solid.name) #stores the chemical name self.e = DoubleVar(value=solid.e) #stores the porosity self.rho = DoubleVar(value=solid.rho) #stores the bulk density self.foc = DoubleVar( value=solid.foc) #stores the organic carbon fraction self.tort = StringVar( value=solid.tort) #stores the default tortuosity correction self.sorp = StringVar( value=solid.sorp) #stores the default sorption correction self.Ref = StringVar( value=solid.Ref) #stores the default sorption correction self.cancelflag = 0 def make_widgets(self): self.bgcolor = self.frame.cget('bg') self.instructions = Label( self.frame, text= ' Are you sure to delete the following solid from database? ' ) self.namelabel = Label(self.frame, text='Material') self.elabel = Label(self.frame, text='Porosity') self.rholabel = Label(self.frame, text='Bulk density\n (kg/L') self.foclabel = Label(self.frame, text='Organic carbon\n fraction') self.tortlabel = Label(self.frame, text='Tortruosity correction') self.sorplabel = Label(self.frame, text='Sorption isotherms') self.Reflabel = Label(self.frame, text='Reference') self.rhounitlabel = Label(self.frame, text=u'g/cm\u00B3') self.namewidget = Label(self.frame, width=16, justify='center', textvariable=self.name) self.ewidget = Label(self.frame, width=8, justify='center', textvariable=self.e) self.rhowidget = Label(self.frame, width=8, justify='center', textvariable=self.rho) self.focwidget = Label(self.frame, width=8, justify='center', textvariable=self.foc) self.tortwidget = Label(self.frame, width=16, justify='center', textvariable=self.tort) self.sorpwidget = Label(self.frame, width=16, justify='center', textvariable=self.sorp) self.Refwidget = Label(self.frame, width=10, justify='center', textvariable=self.Ref) self.blankcolumn = Label(self.frame, text=' ', width=1) self.namecolumn = Label(self.frame, text=' ', width=18) self.ecolumn = Label(self.frame, text=' ', width=10) self.rhocolumn = Label(self.frame, text=' ', width=10) self.foccolumn = Label(self.frame, text=' ', width=10) self.tortcolumn = Label(self.frame, text=' ', width=18) self.sorpcolumn = Label(self.frame, text=' ', width=18) self.Refcolumn = Label(self.frame, text=' ', width=18) self.endcolumn = Label(self.frame, text=' ', width=2) self.deletebutton = Button(self.frame, text='Delete', width=20, command=self.Delete) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.Cancel) self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') #show the widgets on the grid self.instructions.grid(row=0, column=0, columnspan=6, padx=8, sticky='W') self.blankcolumn.grid(row=1, column=0, sticky='WE', padx=1, pady=1) self.namecolumn.grid(row=1, column=1, sticky='WE', padx=1, pady=1) self.ecolumn.grid(row=1, column=2, sticky='WE', padx=1, pady=1) self.rhocolumn.grid(row=1, column=3, sticky='WE', padx=1, pady=1) self.foccolumn.grid(row=1, column=4, sticky='WE', padx=1, pady=1) self.tortcolumn.grid(row=1, column=5, sticky='WE', padx=1, pady=1) self.sorpcolumn.grid(row=1, column=6, sticky='WE', padx=1, pady=1) self.Refcolumn.grid(row=1, column=7, sticky='WE', padx=1, pady=1) self.endcolumn.grid(row=1, column=8, sticky='WE', padx=1, pady=1) self.namelabel.grid(row=2, column=1, sticky='WE', padx=1, pady=1) self.elabel.grid(row=2, column=2, sticky='WE', padx=1, pady=1) self.rholabel.grid(row=2, column=3, sticky='WE', padx=1, pady=1) self.foclabel.grid(row=2, column=4, sticky='WE', padx=1, pady=1) self.tortlabel.grid(row=2, column=5, sticky='WE', padx=1, pady=1) self.sorplabel.grid(row=2, column=6, sticky='WE', padx=1, pady=1) self.Reflabel.grid(row=2, column=7, sticky='WE', padx=1, pady=1) self.rhounitlabel.grid(row=3, column=3, sticky='WE', padx=1, pady=1) self.namewidget.grid(row=4, column=1, padx=1, pady=1, sticky='WE') self.ewidget.grid(row=4, column=2, padx=1, pady=1) self.rhowidget.grid(row=4, column=3, padx=1, pady=1) self.focwidget.grid(row=4, column=4, padx=1, pady=1) self.tortwidget.grid(row=4, column=5, padx=1, pady=1) self.sorpwidget.grid(row=4, column=6, padx=1, pady=1) self.Refwidget.grid(row=4, column=7, padx=1, pady=1) self.blank1.grid(row=5) self.deletebutton.grid(row=6, columnspan=11) self.cancelbutton.grid(row=7, columnspan=11) self.blank2.grid(row=8) self.deletebutton.bind('<Return>', self.Delete) self.focusbutton = self.deletebutton def Delete(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit() def Cancel(self): try: self.name.set(self.solid.name) self.e.set(self.solid.e) self.rho.set(self.solid.rho) self.foc.set(self.solid.foc) self.tort.set(self.solid.tort) self.sorp.set(self.solid.sorp) self.Ref.set(self.solid.Ref) except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class K_Estimator: def __init__(self, master, system, isotherm, coef): """Constructor method. Makes the GUI using the list of "Layer" objects "layers." """ self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.bgcolor = self.frame.cget('bg') self.top = None self.concunit = system.concunit self.timeunit = system.timeunit self.cinit = DoubleVar(value = coef[0]) self.qinit = DoubleVar(value = coef[1]) self.thalf = DoubleVar(value = coef[2]) self.ksorp = DoubleVar(value = coef[3]) self.coef = coef self.isotherms = ['Linear--Kd specified', 'Linear--Kocfoc', 'Freundlich', 'Langmuir'] self.isotherm = isotherm if self.isotherm == self.isotherms[0]: self.Kd = coef[4] if self.isotherm == self.isotherms[1]: self.Kd = 10 ** coef[4]*coef[5] if self.isotherm == self.isotherms[2]: self.Kf = coef[4] self.N = coef[5] if self.isotherm == self.isotherms[3]: self.qmax = coef[4] self.b = coef[5] self.epsilon = coef[6] self.rho = coef[7] def make_widgets(self): self.instructions = Label(self.frame, text = ' Please input the following information to estimate the rate coefficients ') self.leftcolumn = Label(self.frame, text = ' ', width = 2) self.paracolumn = Label(self.frame, text = ' ', width = 20) self.entrycolumn = Label(self.frame, text = ' ', width = 12) self.unitcolumn = Label(self.frame, text = ' ', width = 12) self.thalflabel = Label(self.frame, text = ' Characteristic Half-life Time', width = 24) self.thalfentry = Entry(self.frame, textvariable = self.thalf, width = 12, justify = 'center') self.thalfunit = Label(self.frame, text = self.timeunit, width = 5) self.klabel = Label(self.frame, text = 'Sorption rate coefficient ') self.kentry = Label(self.frame, textvariable = self.ksorp, width = 12) self.ksorpunits = Label(self.frame, text = self.timeunit +u'\u207B\u00b9') self.blank1 = Label(self.frame, text = ' ') self.blank2 = Label(self.frame, text = ' ') self.blank3 = Label(self.frame, text = ' ', width = 20) self.blank4 = Label(self.frame, text = ' ', width = 20) self.updatebutton = Button(self.frame, text = 'Calculate', width = 20, command = self.calculate) self.okbutton = Button(self.frame, text = 'Save', width = 20, command = self.OK) self.cancelbutton = Button(self.frame, text = 'Cancel', width = 20, command = self.Cancel) self.instructions.grid(row = 0, column = 0, columnspan = 6) self.blank1.grid( row = 1, column = 0, columnspan = 6) self.leftcolumn.grid( row = 2, column = 0) self.paracolumn.grid( row = 2, column = 1) self.entrycolumn.grid( row = 2, column = 2) self.unitcolumn.grid( row = 2, column = 3) self.thalflabel.grid( row = 3, column = 1, sticky = 'E') self.thalfentry.grid( row = 3, column = 2) self.thalfunit.grid( row = 3, column = 3, sticky = 'W') self.blank3.grid( row = 4, column = 0, columnspan = 4) self.klabel.grid( row = 5, column = 1, sticky = 'E') self.kentry.grid( row = 5, column = 2) self.ksorpunits.grid( row = 5, column = 3, sticky = 'W') self.blank1.grid( row = 6) self.updatebutton.grid( row = 7, columnspan = 4) self.okbutton.grid( row = 8, columnspan = 4) self.cancelbutton.grid( row = 9, columnspan = 4) self.blank2.grid( row = 10) self.okbutton.bind('<Return>', self.OK) self.focusbutton = self.okbutton self.master.geometry() self.cancelflag = 0 def calculate(self): if self.thalf.get() > 0: if self.isotherm == self.isotherms[0] or self.isotherm == self.isotherms[1]: self.ksorp.set(round((0.693/self.thalf.get()/(1+self.epsilon/self.rho/self.Kd)),4)) elif self.isotherm == self.isotherms[2]: self.ksorp.set(round((0.693/self.thalf.get()/(1+self.epsilon/self.rho/(self.Kf))),4)) elif self.isotherm == self.isotherms[3]: self.ksorp.set(round((0.693/self.thalf.get()/(1+self.epsilon/self.rho/(self.qmax*self.b/(1+self.b*self.cinit.get())))),4)) else: tkmb.showerror(title = self.version, message = 'Please input a non-zero characteristic time and concentration.') self.focusbutton = self.okbutton self.master.tk.lift() self.updateksorption() def updateksorption(self): try: self.kentry.grid_forget() except: pass row = 4 self.kentry.grid( row = 5, column = 2, sticky = 'WE') def OK(self, event = None): self.master.tk.quit() def Cancel(self): try: self.cinit.set(self.coef[0]) self.qinit.set(self.coef[1]) self.thalf.set(self.coef[2]) self.ksorp.set(self.coef[3]) except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class Game: def __init__(self): self.root = Tk() self.frame1 = None self.frame2 = None self.w = None self.scoreC = None self.score = 0 self.hor = True self.upid = self.downid = self.rightid = self.leftid = 0 self.head = -1 self.time = 700 def home(self): self.frame1 = Frame(self.root, width=750, height=350, padx=250, bg="black") self.frame2 = Frame(self.root, height=250, width=750, bg="black", padx=25) self.root.wm_minsize(width=750, height=666) self.root.configure(bg="black") self.frame1.pack_propagate(0) self.frame1.update() self.frame1.configure(pady=self.frame1.cget("height") / 2.5) logo = PhotoImage(file="Game_Logo.gif") starth = Button(self.frame1, text="Hard", bg="orange", padx=25, pady=5, font=Font(family="comic sans MS", size=10), command=lambda: self.callgame(40)) startm = Button(self.frame1, text="Medium", bg="teal", padx=25, pady=5, font=Font(family="comic sans MS", size=10), command=lambda: self.callgame(60)) starte = Button(self.frame1, text="Easy", bg="orange", padx=25, pady=5, font=Font(family="comic sans MS", size=10), command=lambda: self.callgame(75)) self.frame2.pack_propagate(0) exp = """ This is a game in which the arrow keys are used to move the snake around and to get points""" exf = Font(family="comic sans MS", size=20) Label(self.frame2, image=logo, bg="black", text=exp, padx=10).pack(side="right") Label(self.frame2, fg="white", bg="black", text=exp, justify="left", font=exf).pack(side="left") starte.grid(row=0, columnspan=2) startm.grid(row=0, columnspan=2, column=4, padx=18) starth.grid(row=0, columnspan=2, column=8) head = Font(family="comic sans MS", size=30) self.H=Label(self.root, text="SNAKES", font=head, fg="orange", bg="black", pady=10) self.H.pack() self.frame2.pack(expand=True) self.frame1.pack(expand=True) self.root.mainloop() def callgame(self, time): self.time = time self.game() def calldown(self, key): if self.hor: self.w.after_cancel(self.leftid) self.w.after_cancel(self.rightid) self.down(0) def callup(self, key): if self.hor: self.w.after_cancel(self.leftid) self.w.after_cancel(self.rightid) self.up(0) def callright(self, key): if not self.hor: self.w.after_cancel(self.upid) self.w.after_cancel(self.downid) self.right(0) def callleft(self, key): if not self.hor: self.w.after_cancel(self.upid) self.w.after_cancel(self.downid) self.left(0) def game(self): self.score = 0 self.w = Canvas(self.root, width=750, height=500, relief="flat", highlightbackground="grey", highlightthickness=10) self.frame1.destroy() self.frame2.destroy() self.root.configure(width=1000, padx=10) self.root.pack_propagate(0) self.w.configure(background="black") self.w.pack(side="left") self.w.create_line(300, 250, 450, 250, width=10, fill="teal") self.scoreC = Label(self.root, text="Score\n" + str(self.score), bg="black", fg="teal", padx=25, pady=35, font=Font(family="comic sans MS", size=25)) self.head = self.w.create_line(450, 250, 455, 250, width=10, fill="white") self.scoreC.pack(side="top") self.root.bind("<Up>", self.callup) self.root.bind("<Down>", self.calldown) self.root.bind("<Right>", self.callright) self.root.bind("<Left>", self.callleft) self.createFood() self.right(0) def down(self, i): crd = self.w.coords(1) if len(crd) > 0: if crd[0] == crd[2]: if crd[1] > crd[3]: # print("inside if1") crd[1] -= 10 if crd[1] < crd[3]: # print("inside if2") crd[1] += 10 else: if crd[0] > crd[2]: crd[0] -= 10 if crd[0] < crd[2]: crd[0] += 10 crd[-1] += 10 if i == 0: crd.append(crd[-2]) crd.append(crd[-2]) crd[-3] -= 10 if crd[0] == crd[2] and crd[1] == crd[3]: crd = crd[2:] self.w.coords(1, *crd) self.w.delete(self.head) self.head = self.w.create_line(crd[-2], crd[-1], crd[-2], crd[-1] + 5, width=10, fill="orange") end = self.end() self.checkEaten() i += 1 self.hor = False if not end: self.downid = self.w.after(self.time, self.down, i) else: self.w.delete(1) self.w.delete(self.head) self.w.delete(self.food) self.start = Button(self.root, text="Start", bg="orange", padx=25, pady=25, font=Font(family="comic sans MS", size=15), command=lambda: self.callhome()) self.start.pack(side="bottom") def up(self, i): crd = self.w.coords(1) if len(crd)>0: if crd[0] == crd[2]: if crd[1] > crd[3]: # print("inside if1") crd[1] -= 10 if crd[1] < crd[3]: # print("inside if2") crd[1] += 10 else: if crd[0] > crd[2]: crd[0] -= 10 if crd[0] < crd[2]: crd[0] += 10 crd[-1] -= 10 if i == 0: crd.append(crd[-2]) crd.append(crd[-2]) crd[-3] += 10 if crd[0] == crd[2] and crd[1] == crd[3]: crd = crd[2:] self.w.coords(1, *crd) self.w.delete(self.head) self.head = self.w.create_line(crd[-2], crd[-1], crd[-2], crd[-1] - 5, width=10, fill="orange") end = self.end() self.checkEaten() i += 1 self.hor = False if not end: self.upid = self.w.after(self.time, self.up, i) else: self.w.delete(1) self.w.delete(self.head) self.w.delete(self.food) self.start = Button(self.root, text="Start", bg="orange", padx=25, pady=25, font=Font(family="comic sans MS", size=15), command=lambda: self.callhome()) self.start.pack(side="bottom") def right(self, i): crd = self.w.coords(1) if len(crd) > 0: if crd[0] == crd[2]: if crd[1] > crd[3]: # print("inside if1") crd[1] -= 10 if crd[1] < crd[3]: # print("inside if2") crd[1] += 10 else: if crd[0] > crd[2]: crd[0] -= 10 if crd[0] < crd[2]: crd[0] += 10 crd[-2] += 10 if i == 0: crd.append(crd[-2]) crd.append(crd[-2]) crd[-4] -= 10 if crd[0] == crd[2] and crd[1] == crd[3]: crd = crd[2:] self.w.coords(1, *crd) self.w.delete(self.head) self.head = self.w.create_line(crd[-2], crd[-1], crd[-2] + 5, crd[-1], width=10, fill="orange") end = self.end() self.checkEaten() i += 1 self.hor = True if not end: self.rightid = self.w.after(self.time, self.right, i) else: self.w.delete(1) self.w.delete(self.head) self.w.delete(self.food) self.start = Button(self.root, text="Start", bg="orange", padx=25, pady=25, font=Font(family="comic sans MS", size=15), command=lambda: self.callhome()) self.start.pack(side="bottom") def left(self, i): crd = self.w.coords(1) if len(crd) > 0: if crd[0] == crd[2]: if crd[1] > crd[3]: # print("inside if1") crd[1] -= 10 if crd[1] < crd[3]: # print("inside if2") crd[1] += 10 else: if crd[0] > crd[2]: crd[0] -= 10 if crd[0] < crd[2]: crd[0] += 10 crd[-2] -= 10 if i == 0: crd.append(crd[-2]) crd.append(crd[-2]) crd[-4] += 10 if crd[0] == crd[2] and crd[1] == crd[3]: crd = crd[2:] self.w.coords(1, *crd) self.w.delete(self.head) self.head = self.w.create_line(crd[-2], crd[-1], crd[-2] - 5, crd[-1], width=10, fill="orange") end = self.end() self.checkEaten() i += 1 self.hor = True if not end: self.leftid = self.w.after(self.time, self.left, i) else: self.w.delete(1) self.w.delete(self.head) self.w.delete(self.food) self.start = Button(self.root, text="Start", bg="orange", padx=25, pady=25, font=Font(family="comic sans MS", size=15), command=lambda: self.callhome()) self.start.pack(side="bottom") def createFood(self): # self.w.delete(self.food) #deleting old food. crd = self.w.coords(1) ext = [] for i in crd: ext.append(i) for j in range(-50, 50): ext.append(i + j) randx = random.randrange(20, 730) randy = random.randrange(20, 480) while randx not in ext and randy not in ext: randx = random.randrange(20, 730) randy = random.randrange(20, 480) self.food = self.w.create_line(randx, randy, randx + 12, randy, width=10, fill="yellow") def checkEaten(self): headcoords = self.w.coords(self.head) foodcoords = self.w.coords(self.food) # self.w.delete(self.food) flag = False # print(headcoords[-4]) # print(foodcoords[-4]) # print(foodcoords[-2]) if int(headcoords[-4]) in range(int(foodcoords[-4]) - 7, int(foodcoords[-2]) + 7) and int( headcoords[-3]) in range(int(foodcoords[-1]) - 10, int(foodcoords[-1] + 10)): flag = True if flag: self.grow() self.score += 10 self.scoreC.configure(text="Score\n" + str(self.score), bg="black", fg="teal", padx=25, pady=35, font=Font(family="comic sans MS", size=25)) self.w.delete(self.food) self.createFood() def grow(self): crd = self.w.coords(1) if crd[0] != crd[2]: # horizontal condition if crd[0] < crd[2]: crd[0] -= 20 else: crd[0] += 20 self.w.coords(1, *crd) else: if crd[3] < crd[1]: crd[1] += 20 else: crd[1] -= 20 self.w.coords(1, *crd) def end(self): crd = self.w.coords(1) h = self.w.coords(self.head) a = 0 while a < len(crd) - 2: if crd[a] == crd[a + 2]: if (h[0] == crd[a] and crd[a + 1] < h[1] < crd[a + 3]) or ( h[0] == crd[a] and crd[a + 1] > h[1] > crd[a + 3]): return True else: if (h[1] == crd[a + 1] and crd[a] < h[0] < crd[a + 2]) or (h[1] == crd[a + 1] and crd[a] > h[0] > crd[a + 2]): return True a += 2 if (h[0] == 0 and 0 < h[1] < 500) or (h[1] == 0 and 0 < h[0] < 750) or (h[1] == 510 and 0 < h[0] < 750) or (h[0] == 760 and 0<h[1]<500): return True return False def callhome(self): self.w.destroy() self.start.destroy() self.H.destroy() self.scoreC.destroy() self.home()
class LayerEditor: """Gets the contaminant properties.""" def __init__(self, master, system, layer, layers, editflag): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) #superscript font self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.top = None #flag for existence of toplevel# self.system = system self.lengthunit = system.lengthunit self.layer = layer self.layers = layers self.types = [] self.tort_types = [] self.torts = layer.torts self.h = DoubleVar(value=10.0) self.alpha = DoubleVar(value=1.0) self.doc = DoubleVar(value=0.0) for matrix in system.matrices: self.types.append(matrix.name) self.tort_types.append(matrix.components[0].tort) self.type = StringVar(value=self.types[0]) self.tort = StringVar(value=self.tort_types[0]) self.editflag = editflag self.cancelflag = 0 if self.editflag == 1: self.type.set(layer.type) self.tort.set(layer.tort) self.h.set(layer.h) self.alpha.set(layer.alpha) self.doc.set(layer.doc) self.names = [] if len(layers) == 0: self.names.append('Deposition') self.names.append('Layer 1') else: for layer in self.layers: self.names.append(layer.name) self.names.append('Layer ' + str(layers[-1].number + 1)) if self.names[0] == 'Deposition': self.names.remove(self.names[0]) else: self.names.insert(0, 'Deposition') if self.editflag == 0: self.name = StringVar(value=self.names[-1]) else: self.name = StringVar(value=self.layer.name) def make_widgets(self): """Make the widgets for the window.""" self.bgcolor = self.frame.cget('bg') self.instructions = Label( self.frame, text= ' Please input the following information about the layer properties: ' ) self.namelabel = Label(self.frame, text='Layer') self.typelabel = Label(self.frame, text='Material') self.tortlabel = Label(self.frame, text='Tortuosity Correction') self.hlabel = Label(self.frame, text='Thickness') self.alphalabel = Label(self.frame, text='Hydrodynamic\n' + 'Dispersivity') self.doclabel = Label(self.frame, text='Dissolved organic\n' + 'matter concentration ') if self.editflag == 0: self.namewidget = OptionMenu(self.frame, self.name, *self.names, command=self.click_type) else: self.namewidget = Label(self.frame, textvariable=self.name, justify='center') self.typewidget = OptionMenu(self.frame, self.type, *self.types, command=self.click_tortuosity) self.hwidget = Entry(self.frame, textvariable=self.h, width=8, justify='center') self.alphawidget = Entry(self.frame, textvariable=self.alpha, width=8, justify='center') self.docwidget = Entry(self.frame, textvariable=self.doc, width=8, justify='center') self.thickunits = Label(self.frame, text=self.lengthunit) self.depthickunits = Label(self.frame, text=self.lengthunit + '/yr') self.alphaunits = Label(self.frame, text=self.lengthunit) self.docunits = Label(self.frame, text='mg/L') self.blankcolumn = Label(self.frame, text=' ', width=2) self.namecolumn = Label(self.frame, text=' ', width=14) self.typecolumn = Label(self.frame, text=' ', width=18) self.tortcolumn = Label(self.frame, text=' ', width=20) self.thickcolumn = Label(self.frame, text=' ', width=12) self.alphacolumn = Label(self.frame, text=' ', width=12) self.doccolumn = Label(self.frame, text=' ', width=12) self.okbutton = Button(self.frame, text='OK', width=20, command=self.OK) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.Cancel) self.blank1 = Label(self.frame, text=' ') self.blank2 = Label(self.frame, text=' ') #show the widgets on the grid self.instructions.grid(row=0, column=0, columnspan=6, padx=8, sticky='W') self.blankcolumn.grid(row=1, column=0) self.namecolumn.grid(row=1, column=1) self.typecolumn.grid(row=1, column=2) self.tortcolumn.grid(row=1, column=3) self.thickcolumn.grid(row=1, column=4) self.alphacolumn.grid(row=1, column=5) self.doccolumn.grid(row=1, column=6) self.namelabel.grid(row=2, column=1, sticky='WE', padx=4, pady=1) self.typelabel.grid(row=2, column=2, sticky='WE', padx=1, pady=1) self.tortlabel.grid(row=2, column=3, sticky='WE', padx=1, pady=1) self.hlabel.grid(row=2, column=4, sticky='WE', padx=1, pady=1) self.alphalabel.grid(row=2, column=5, sticky='WE', padx=1, pady=1) self.doclabel.grid(row=2, column=6, sticky='WE', padx=1, pady=1) self.namewidget.grid(row=4, column=1, sticky='WE', padx=1, pady=1) self.hwidget.grid(row=4, column=4, padx=1, pady=1) self.alphawidget.grid(row=4, column=5, padx=1, pady=1) self.docwidget.grid(row=4, column=6, padx=1, pady=1) self.thickunits.grid(row=3, column=4, sticky='WE', padx=1, pady=1) self.alphaunits.grid(row=3, column=5, sticky='WE', padx=1, pady=1) self.docunits.grid(row=3, column=6, sticky='WE', padx=1, pady=1) self.blank1.grid(row=5) self.okbutton.grid(row=6, columnspan=11) self.cancelbutton.grid(row=7, columnspan=11) self.blank2.grid(row=8) self.okbutton.bind('<Return>', self.OK) self.focusbutton = self.okbutton #if self.editflag == 0: self.click_type() self.click_type() def click_type(self, event=None): try: self.thickunits.grid_forget() self.depthickunits.grid_forget() except: pass if self.name.get() == 'Deposition': self.depthickunits.grid(row=3, column=4, sticky='WE', padx=1, pady=1) else: self.thickunits.grid(row=3, column=4, sticky='WE', padx=1, pady=1) self.typewidget.grid(row=4, column=2, sticky='WE', padx=1, pady=1) self.click_tortuosity(event=1) def click_tortuosity(self, event=None): """Give the default tortuosity model corresponding to the selected layer type.""" #try: if event != 1: self.tort.set(self.tort_types[self.types.index(self.type.get())]) self.tortwidget = OptionMenu(self.frame, self.tort, *self.torts) self.tortwidget.grid_forget() self.tortwidget.grid(row=4, column=3, padx=2, pady=1, sticky='WE') def OK(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit() def chemicals_error(self): tkmb.showerror(title=self.version, message='This chemical has already been selected!') self.focusbutton = self.okbutton self.master.tk.lift() def Cancel(self): try: self.number.set(self.layer.number) self.type.set(self.layer.type) self.tort.set(self.layer.tort) self.h.set(self.layer.h) self.alpha.set(self.layer.alpha) self.doc.set(self.layer.doc) except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()