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()
Пример #2
0
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()
Пример #3
0
 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()
Пример #5
0
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()
Пример #7
0
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()
Пример #8
0
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()
Пример #9
0
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()
Пример #10
0
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()
Пример #11
0
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()
Пример #12
0
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()
Пример #13
0
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()
Пример #14
0
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
Пример #15
0
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()
Пример #17
0
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()
Пример #20
0
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)
Пример #21
0
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()
Пример #23
0
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()
Пример #24
0
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()
Пример #25
0
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()
Пример #27
0
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()
Пример #28
0
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()
Пример #29
0
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()