示例#1
0
文件: Extfile.py 项目: shambo001/peat
 def doimport():
     idir = importdir.get()
     ext = filetype.get()
     if idir == None:
         return
     files = os.listdir(idir)
     okfiles = []
     for f in files:
         pth = os.path.join(idir,f)
         if os.path.isfile(pth):
             if ext != 'any':
                 if os.path.splitext(pth)[1] not in self.extensions[ext]:
                     continue
             okfiles.append(pth)
     print 'files to be used:', okfiles
     DB.addField('file', 'File')
     from Dialogs import PEATDialog
     self.pb=PEATDialog(self.parent.master, option='progressbar',
                                   message='Importing files')
     self.pb.update_progress(0)
     total = len(okfiles)
     row=0
     #iterate over filenames in folder and add one rec to DB for each file
     for f in okfiles:
         recname=os.path.basename(f)
         DB.addBlob(recname, 'file', f)
         print 'added %s as %s' %(f,recname)
         row=row+1
         c=float(row)/float(total)*100.0
         self.pb.update_progress(c)
     self.pb.close()
     if callback!=None:
         callback()
     return
示例#2
0
 def doAll(self, methods=['method 1']):
     """Process all datasets in ekinprj"""
     E=self.E
     vals={}
     from Dialogs import PEATDialog
     pb=PEATDialog(self.mainwin, option='progressbar',
                                   message='Analysing Data..')
     pb.update_progress(0)
     total = len(E.datasets); count=0
     for d in E.datasets:
         if '_diff' in d or '_vanthoff' in d:
             continue
         vals[d]={}
         name = d
         if 'method 1' in methods:
             vals[d]['dH1'], vals[d]['dS1'], ax = self.fitVantHoff(E,d,
                                                      transwidth=int(self.tw.getvalue()),
                                                      show=False,figname=name)
         if 'method 2' in methods:
             vals[d]['dH2'], vals[d]['dTm2'], vals[d]['dCp2'] = self.fitElwellSchellman(E,d,show=False,figname=name)
         if 'method 3' in methods:
             vals[d]['dH3'], vals[d]['dTm3'] = self.fitDifferentialCurve(E,d,show=False,figname=name)
         count += 1
         pb.update_progress(float(count)/total*100.0)
     pb.close()
     self.showTable(vals)
     return
示例#3
0
 def doimport():
     idir = importdir.get()
     ext = filetype.get()
     if idir == None:
         return
     files = os.listdir(idir)
     okfiles = []
     for f in files:
         pth = os.path.join(idir, f)
         if os.path.isfile(pth):
             if ext != 'any':
                 if os.path.splitext(
                         pth)[1] not in self.extensions[ext]:
                     continue
             okfiles.append(pth)
     print 'files to be used:', okfiles
     DB.addField('file', 'File')
     from Dialogs import PEATDialog
     self.pb = PEATDialog(self.parent.master,
                          option='progressbar',
                          message='Importing files')
     self.pb.update_progress(0)
     total = len(okfiles)
     row = 0
     #iterate over filenames in folder and add one rec to DB for each file
     for f in okfiles:
         recname = os.path.basename(f)
         DB.addBlob(recname, 'file', f)
         print 'added %s as %s' % (f, recname)
         row = row + 1
         c = float(row) / float(total) * 100.0
         self.pb.update_progress(c)
     self.pb.close()
     if callback != None:
         callback()
     return
示例#4
0
 def doAll(self, methods=['method 1']):
     """Process all datasets in ekinprj"""
     E = self.E
     vals = {}
     from Dialogs import PEATDialog
     pb = PEATDialog(self.mainwin,
                     option='progressbar',
                     message='Analysing Data..')
     pb.update_progress(0)
     total = len(E.datasets)
     count = 0
     for d in E.datasets:
         if '_diff' in d or '_vanthoff' in d:
             continue
         vals[d] = {}
         name = d
         if 'method 1' in methods:
             vals[d]['dH1'], vals[d]['dS1'], ax = self.fitVantHoff(
                 E,
                 d,
                 transwidth=int(self.tw.getvalue()),
                 show=False,
                 figname=name)
         if 'method 2' in methods:
             vals[d]['dH2'], vals[d]['dTm2'], vals[d][
                 'dCp2'] = self.fitElwellSchellman(E,
                                                   d,
                                                   show=False,
                                                   figname=name)
         if 'method 3' in methods:
             vals[d]['dH3'], vals[d]['dTm3'] = self.fitDifferentialCurve(
                 E, d, show=False, figname=name)
         count += 1
         pb.update_progress(float(count) / total * 100.0)
     pb.close()
     self.showTable(vals)
     return
示例#5
0
    def doGUI(self):
        """Data selection dialog"""
        import tkFont
        dwin = self.main

        self.recs = self.DB.getRecs()
        fields = self.DB.getFields() + ['Structure']

        yscrollbar = Scrollbar(dwin, orient='vertical', width=12)
        yscrollbar.grid(row=1, column=2, sticky='news', padx=2)
        recsbox = Listbox(dwin,
                          bg='white',
                          exportselection=0,
                          height=18,
                          width=20,
                          yscrollcommand=yscrollbar.set,
                          selectmode=EXTENDED)
        yscrollbar.config(command=recsbox.yview)
        Label(dwin, text='Records:').grid(row=0, column=0, sticky='news')
        recsbox.grid(row=1,
                     column=0,
                     columnspan=2,
                     sticky='news',
                     padx=1,
                     pady=3)
        recsbox.config(state=NORMAL)

        y1scrollbar = Scrollbar(dwin, orient='vertical', width=12)
        y1scrollbar.grid(row=1, column=5, sticky='news', padx=2)
        colsbox = Listbox(dwin,
                          bg='white',
                          exportselection=0,
                          height=20,
                          width=20,
                          yscrollcommand=y1scrollbar.set,
                          selectmode=EXTENDED)

        y1scrollbar.config(command=colsbox.yview)
        Label(dwin, text='Fields:').grid(row=0, column=3, sticky='news')
        colsbox.grid(row=1,
                     column=3,
                     columnspan=2,
                     sticky='news',
                     padx=1,
                     pady=3)
        colsbox.config(state=NORMAL)
        dwin.rowconfigure(1, weight=1)
        dwin.columnconfigure(0, weight=1)
        for r in self.recs:
            recsbox.insert('end', r)
        for f in fields:
            colsbox.insert('end', f)

        def dorecslist():
            recsbox.delete(0, END)
            if srecsvar.get() == True:
                self.recs = self.parent.table.get_selectedRecordNames()
            else:
                self.recs = self.DB.getRecs()
            for r in self.recs:
                recsbox.insert('end', r)
            return

        other = Frame(dwin)
        other.grid(row=2,
                   column=0,
                   columnspan=7,
                   sticky='news',
                   padx=1,
                   pady=3)
        srecsvar = BooleanVar()
        srecsvar.set(False)
        Checkbutton(other,
                    text='use only selected records',
                    variable=srecsvar,
                    command=dorecslist).pack(side=LEFT, fill=BOTH)
        from Dialogs import PEATDialog
        self.pb = PEATDialog.createBusyBar(other)
        self.pb.pack(side=RIGHT, fill=BOTH, padx=5)
        d1 = Frame(dwin)
        d1.grid(row=1, column=6, columnspan=2, sticky='news', padx=1, pady=3)

        def display():
            srecs = [self.recs[int(item)] for item in recsbox.curselection()]
            sfields = [fields[int(item)] for item in colsbox.curselection()]
            slabel = entry1.getvalue()
            if len(srecs) == 0 or len(sfields) == 0:
                return
            g = groupby.getcurselection()

            if 'Structure' in sfields:
                self.displayStructure(srecs)
                sfields.remove('Structure')
            self.displayEkin(srecs,
                             sfields,
                             slabel,
                             html=htmlvar.get(),
                             overlay=overlayvar.get(),
                             groupby=g)

            return

        def preview():
            srecs = [self.recs[int(item)] for item in recsbox.curselection()]
            sfields = [fields[int(item)] for item in colsbox.curselection()]
            if len(srecs) == 0 or len(sfields) == 0:
                st.insert(END, 'Choose recs/fields!')
                return
            st.delete(1.0, END)
            slabel = entry1.getvalue()
            sl = self.findNames(srecs, sfields, slabel)
            st.insert(END, str(sl))
            return

        def closedialog():
            dwin.destroy()
            if not self.parent:
                sys.exit()
            return

        entry1 = Pmw.EntryField(d1,
                                labelpos='n',
                                value='',
                                command=preview,
                                label_text='Data label:')
        entry1.pack(side=TOP, fill=BOTH)
        Button(d1, text='Preview', command=preview).pack(side=TOP, fill=BOTH)
        Button(d1, text='Plot Options',
               command=self.Opt.plotSetup).pack(side=TOP, fill=BOTH)
        groupby = Pmw.OptionMenu(d1,
                                 labelpos='w',
                                 label_text='Group By:',
                                 items=('field', 'record', 'none'),
                                 menubutton_width=8)
        groupby.pack(side=TOP, fill=BOTH)
        htmlvar = BooleanVar()
        htmlvar.set(False)
        overlayvar = BooleanVar()
        overlayvar.set(False)
        self.orientvar = BooleanVar()
        self.orientvar.set(False)
        Button(d1, text='Display', command=display,
               bg='#FFFF99').pack(side=TOP, fill=BOTH)
        #Checkbutton(d1, text='send to web page', variable=htmlvar).pack(side=TOP,fill=BOTH)
        Checkbutton(d1, text='overlay plots',
                    variable=overlayvar).pack(side=TOP, fill=BOTH)
        Checkbutton(d1, text='orient vertical',
                    variable=self.orientvar).pack(side=TOP, fill=BOTH)
        st = Pmw.ScrolledText(d1,
                              labelpos='n',
                              label_text='Data Labels found:',
                              usehullsize=1,
                              hull_width=200,
                              hull_height=220,
                              text_wrap='char')
        st.pack(side=TOP, fill=BOTH)
        Button(d1, text='Close', command=closedialog).pack(side=TOP, fill=BOTH)

        return
示例#6
0
class FileHandler(object):
    """Class to handle external files for peatdb, uses some stuff from
       old peat from db_actions etc
       Should add thumbnail stuff here??"""

    extensions = {
        'image':
        ['.jpg', '.jpeg', '.tiff', '.tif', '.gif', '.ps', '.png', '.ico'],
        'doc':
        ['.doc', '.xls', '.ppt', '.pdf', '.docx', '.txt', '.csv', '.odt'],
        'compressed': ['.zip', '.gz', '.bz', '.tar'],
        'any': ''
    }

    def __init__(self, parent=None, DB=None):
        self.parent = parent
        self.currplatform = platform.system()

        return

    def displayFile(self, filerec):
        """Uses a new method of file storage with blobs"""
        #now we just get the blob from the filerecord object...
        from PILView import PILViewer
        from PEATDB.Record import FileRecord
        #check class
        if not type(filerec) is FileRecord:
            return False
        myblob = filerec.blob
        ext = filerec.ext
        mtype = filerec.mimetype
        print 'mimetype is', mtype
        if myblob != None:
            f = myblob.open("r")
            filename = f.name
            f.close()
        else:
            return False

        if self.currplatform == 'Linux':
            #try using mailcaps on linux system
            import mailcap, os
            d = mailcap.getcaps()
            print mtype, filename
            f = mailcap.findmatch(d, mtype)[1]
            os.system(f['view'] % filename)
            return
        else:
            import os, tempfile, shutil
            tempname = os.path.normpath(
                os.path.join(tempfile.gettempdir(), filerec.name))
            if not os.path.exists(tempname):
                #os.remove(tempname)
                shutil.copy(filename, tempname)
            os.startfile(tempname)

        return True

    def addFileDialog(self, filerec=None):
        """Do the front-end stuff for adding files to peat"""
        import tkFileDialog
        filename = tkFileDialog.askopenfilename(defaultextension='.*',
                                                initialdir=os.getcwd(),
                                                filetypes=[("All files", "*.*")
                                                           ])
        self.newfile = filename
        return filename

    def importFileset(self, DB, parentframe=None, callback=None):
        """Import a series of external files in a folder to peat"""
        def getdir():
            import tkFileDialog, os
            d = tkFileDialog.askdirectory(initialdir=importdir.get(),
                                          title='Select directory files',
                                          mustexist=1,
                                          parent=self.parent.master)
            if d:
                importdir.set(d)
                return

        def doimport():
            idir = importdir.get()
            ext = filetype.get()
            if idir == None:
                return
            files = os.listdir(idir)
            okfiles = []
            for f in files:
                pth = os.path.join(idir, f)
                if os.path.isfile(pth):
                    if ext != 'any':
                        if os.path.splitext(
                                pth)[1] not in self.extensions[ext]:
                            continue
                    okfiles.append(pth)
            print 'files to be used:', okfiles
            DB.addField('file', 'File')
            from Dialogs import PEATDialog
            self.pb = PEATDialog(self.parent.master,
                                 option='progressbar',
                                 message='Importing files')
            self.pb.update_progress(0)
            total = len(okfiles)
            row = 0
            #iterate over filenames in folder and add one rec to DB for each file
            for f in okfiles:
                recname = os.path.basename(f)
                DB.addBlob(recname, 'file', f)
                print 'added %s as %s' % (f, recname)
                row = row + 1
                c = float(row) / float(total) * 100.0
                self.pb.update_progress(c)
            self.pb.close()
            if callback != None:
                callback()
            return

        def close():
            win.destroy()
            return

        if parentframe != None:
            win = Frame(master=parentframe, relief=RAISED)
            win.pack(fill=BOTH)
        else:
            win = Toplevel()
            win.title('Import ext files')

        importdir = StringVar()
        importdir.set(os.getcwd())
        Label(win, textvariable=importdir, bg='white',
              justify=RIGHT).pack(fill=BOTH, side=TOP)
        Button(win, text='Select Directory', command=getdir).pack(fill=BOTH,
                                                                  side=TOP)
        filetype = StringVar()
        filetype.set('any')
        optmenu = Pmw.OptionMenu(win,
                                 labelpos='w',
                                 label_text='File Type:',
                                 menubutton_textvariable=filetype,
                                 items=self.extensions.keys(),
                                 menubutton_width=10)
        optmenu.pack(fill=BOTH, side=TOP)
        Button(win, text='Import', command=doimport).pack(fill=BOTH, side=TOP)
        Button(win, text='Cancel', command=close).pack(fill=BOTH, side=TOP)

        return

    def exportExtFiles(self, DB):
        """Get all stored ext files in DB and save to folder"""
        import tkFileDialog, os, shutil
        expdir = tkFileDialog.askdirectory(initialdir=os.getcwd(),
                                           title='Select a directory',
                                           mustexist=1,
                                           parent=self.parent.master)
        if not expdir:
            return
        path = os.path.join(expdir, 'peat-export')
        if not os.path.exists(path):
            os.mkdir(path)
        count = 0
        files = DB.getExtFilenames()
        for f in files:
            shutil.copyfile(files[f], os.path.join(path, f))
            count += 1
        tkMessageBox.showinfo("Exported",
                              'Done. Exported %s files to\n%s' % (count, path))
        return

    def displayExtFiles(self, DB):
        """Display blobs in DB as web page links"""
        files = DB.getExtFilenames()
        print files
        if len(files) == 0:
            return
        items = []
        for f in files:
            print f, files[f]
            items.append('<a href=%s>%s</a>' % (files[f], f))
        import markup
        page = markup.page()
        page.init(title="PEATDB Files Preview",
                  css=('one.css'),
                  header="Preview for project",
                  footer="PEATDB")
        page.ul(class_='mylist')
        page.li(items, class_='myitem')
        page.ul.close()

        filename = '/tmp/prevtemp.html'
        hf = open(filename, 'w')
        for c in page.content:
            hf.write(c)
        hf.close()
        import webbrowser
        webbrowser.open(filename, autoraise=1)
        return
示例#7
0
文件: Compare.py 项目: shambo001/peat
    def doGUI(self):
        """Data selection dialog"""
        import tkFont
        dwin = self.main
        
        self.recs = self.DB.getRecs()
        fields = self.DB.getFields() + ['Structure']

        yscrollbar=Scrollbar(dwin,orient='vertical',width=12)
        yscrollbar.grid(row=1,column=2,sticky='news',padx=2)
        recsbox=Listbox(dwin,bg='white',
                         exportselection=0,
                         height=18,
                         width=20,
                         yscrollcommand=yscrollbar.set,
                         selectmode=EXTENDED)
        yscrollbar.config(command=recsbox.yview)
        Label(dwin,text='Records:').grid(row=0,column=0,sticky='news')
        recsbox.grid(row=1,column=0,columnspan=2,sticky='news',padx=1,pady=3)
        recsbox.config(state=NORMAL)

        y1scrollbar=Scrollbar(dwin,orient='vertical',width=12)
        y1scrollbar.grid(row=1,column=5,sticky='news',padx=2)
        colsbox=Listbox(dwin,bg='white',
                         exportselection=0,
                         height=20,
                         width=20,
                         yscrollcommand=y1scrollbar.set,
                         selectmode=EXTENDED)

        y1scrollbar.config(command=colsbox.yview)
        Label(dwin,text='Fields:').grid(row=0,column=3,sticky='news')
        colsbox.grid(row=1,column=3,columnspan=2,sticky='news',padx=1,pady=3)
        colsbox.config(state=NORMAL)
        dwin.rowconfigure(1, weight=1)
        dwin.columnconfigure(0, weight=1)
        for r in self.recs:
            recsbox.insert('end', r)
        for f in fields:
            colsbox.insert('end', f)

        def dorecslist():
            recsbox.delete(0, END)
            if srecsvar.get() == True:
                self.recs = self.parent.table.get_selectedRecordNames()
            else:
                self.recs = self.DB.getRecs()
            for r in self.recs:
                recsbox.insert('end', r)
            return

        other = Frame(dwin)
        other.grid(row=2,column=0,columnspan=7,sticky='news',padx=1,pady=3)
        srecsvar = BooleanVar(); srecsvar.set(False)
        Checkbutton(other, text='use only selected records', variable=srecsvar,
                        command=dorecslist).pack(side=LEFT,fill=BOTH)
        from Dialogs import PEATDialog
        self.pb=PEATDialog.createBusyBar(other)
        self.pb.pack(side=RIGHT,fill=BOTH,padx=5)
        d1 = Frame(dwin)
        d1.grid(row=1,column=6,columnspan=2,sticky='news',padx=1,pady=3)

        def display():
            srecs = [self.recs[int(item)] for item in recsbox.curselection()]
            sfields = [fields[int(item)] for item in colsbox.curselection()]
            slabel = entry1.getvalue()
            if len(srecs)==0 or len(sfields)==0:
                return
            g=groupby.getcurselection()

            if 'Structure' in sfields:
                self.displayStructure(srecs)         
                sfields.remove('Structure')    
            self.displayEkin(srecs, sfields, slabel, html=htmlvar.get(),
                               overlay=overlayvar.get(), groupby=g)
            
            return

        def preview():
            srecs = [self.recs[int(item)] for item in recsbox.curselection()]
            sfields = [fields[int(item)] for item in colsbox.curselection()]
            if len(srecs)==0 or len(sfields)==0:
                st.insert(END, 'Choose recs/fields!')
                return
            st.delete(1.0, END)
            slabel = entry1.getvalue()            
            sl = self.findNames(srecs, sfields, slabel)
            st.insert(END, str(sl))
            return

        def closedialog():
            dwin.destroy()
            if not self.parent:
                sys.exit()
            return

        entry1 = Pmw.EntryField(d1,
                    labelpos = 'n',
                    value = '',
                    command=preview,
                    label_text = 'Data label:')
        entry1.pack(side=TOP,fill=BOTH)
        Button(d1, text='Preview', command=preview).pack(side=TOP,fill=BOTH)
        Button(d1, text='Plot Options', command=self.Opt.plotSetup).pack(side=TOP,fill=BOTH)
        groupby = Pmw.OptionMenu (d1,
                labelpos = 'w',
                label_text = 'Group By:',
                items = ('field','record','none'),
                menubutton_width = 8 )
        groupby.pack(side=TOP,fill=BOTH)
        htmlvar = BooleanVar(); htmlvar.set(False)
        overlayvar = BooleanVar(); overlayvar.set(False)
        self.orientvar = BooleanVar(); self.orientvar.set(False)
        Button(d1, text='Display', command=display, bg='#FFFF99').pack(side=TOP,fill=BOTH)
        #Checkbutton(d1, text='send to web page', variable=htmlvar).pack(side=TOP,fill=BOTH)        
        Checkbutton(d1, text='overlay plots', variable=overlayvar).pack(side=TOP,fill=BOTH)
        Checkbutton(d1, text='orient vertical', variable=self.orientvar).pack(side=TOP,fill=BOTH)
        st = Pmw.ScrolledText(d1,
                labelpos = 'n',
                label_text='Data Labels found:',
                usehullsize = 1,
                hull_width = 200,
                hull_height = 220,
                text_wrap='char')
        st.pack(side=TOP,fill=BOTH)
        Button(d1, text='Close', command=closedialog).pack(side=TOP,fill=BOTH)

        return
示例#8
0
文件: Extfile.py 项目: shambo001/peat
class FileHandler(object):
    """Class to handle external files for peatdb, uses some stuff from
       old peat from db_actions etc
       Should add thumbnail stuff here??"""

    extensions = {'image' : ['.jpg','.jpeg','.tiff','.tif','.gif','.ps','.png','.ico'],
                  'doc' : ['.doc','.xls','.ppt','.pdf','.docx','.txt','.csv','.odt'],
                  'compressed' : ['.zip','.gz','.bz','.tar'],
                  'any':''}

    def __init__(self, parent=None, DB=None):
        self.parent = parent
        self.currplatform = platform.system()

        return

    def displayFile(self, filerec):
        """Uses a new method of file storage with blobs"""
        #now we just get the blob from the filerecord object...
        from PILView import PILViewer
        from PEATDB.Record import FileRecord
        #check class        
        if not type(filerec) is FileRecord:           
            return False
        myblob = filerec.blob
        ext = filerec.ext
        mtype = filerec.mimetype
        print 'mimetype is', mtype
        if myblob != None:
            f = myblob.open("r")
            filename = f.name
            f.close()
        else:
            return False

        if self.currplatform == 'Linux':
            #try using mailcaps on linux system
            import mailcap, os
            d=mailcap.getcaps()
            print mtype, filename
            f=mailcap.findmatch(d, mtype)[1]
            os.system(f['view'] %filename)
            return
        else:
            import os, tempfile, shutil
            tempname = os.path.normpath(os.path.join(tempfile.gettempdir(), filerec.name))
            if not os.path.exists(tempname):
                #os.remove(tempname)
                shutil.copy(filename, tempname)
            os.startfile(tempname)

        return True

    def addFileDialog(self, filerec=None):
        """Do the front-end stuff for adding files to peat"""
        import tkFileDialog
        filename=tkFileDialog.askopenfilename(defaultextension='.*',
                                              initialdir=os.getcwd(),
                                              filetypes=[("All files","*.*")])
        self.newfile = filename
        return filename


    def importFileset(self, DB, parentframe=None, callback=None):
        """Import a series of external files in a folder to peat"""

        def getdir():
            import tkFileDialog, os
            d=tkFileDialog.askdirectory(initialdir=importdir.get(),title='Select directory files',
                                                mustexist=1,parent=self.parent.master)
            if d:
                importdir.set(d)
                return

        def doimport():
            idir = importdir.get()
            ext = filetype.get()
            if idir == None:
                return
            files = os.listdir(idir)
            okfiles = []
            for f in files:
                pth = os.path.join(idir,f)
                if os.path.isfile(pth):
                    if ext != 'any':
                        if os.path.splitext(pth)[1] not in self.extensions[ext]:
                            continue
                    okfiles.append(pth)
            print 'files to be used:', okfiles
            DB.addField('file', 'File')
            from Dialogs import PEATDialog
            self.pb=PEATDialog(self.parent.master, option='progressbar',
                                          message='Importing files')
            self.pb.update_progress(0)
            total = len(okfiles)
            row=0
            #iterate over filenames in folder and add one rec to DB for each file
            for f in okfiles:
                recname=os.path.basename(f)
                DB.addBlob(recname, 'file', f)
                print 'added %s as %s' %(f,recname)
                row=row+1
                c=float(row)/float(total)*100.0
                self.pb.update_progress(c)
            self.pb.close()
            if callback!=None:
                callback()
            return

        def close():
            win.destroy()
            return

        if parentframe!=None:
            win = Frame(master=parentframe,relief=RAISED)
            win.pack(fill=BOTH)
        else:
            win = Toplevel()
            win.title('Import ext files')

        importdir=StringVar(); importdir.set(os.getcwd())
        Label(win,textvariable=importdir,bg='white',justify=RIGHT).pack(fill=BOTH,side=TOP)
        Button(win,text='Select Directory',command=getdir).pack(fill=BOTH,side=TOP)
        filetype=StringVar(); filetype.set('any')
        optmenu = Pmw.OptionMenu (win,
                labelpos = 'w',
                label_text = 'File Type:',
                menubutton_textvariable = filetype,
                items = self.extensions.keys(),
                menubutton_width = 10 )
        optmenu.pack(fill=BOTH,side=TOP)
        Button(win,text='Import',command=doimport).pack(fill=BOTH,side=TOP)
        Button(win,text='Cancel',command=close).pack(fill=BOTH,side=TOP)

        return

    def exportExtFiles(self, DB):
        """Get all stored ext files in DB and save to folder"""
        import tkFileDialog, os, shutil
        expdir=tkFileDialog.askdirectory(initialdir=os.getcwd(),title='Select a directory',
                                          mustexist=1,parent=self.parent.master)
        if not expdir:
            return
        path = os.path.join(expdir,'peat-export')
        if not os.path.exists(path):
            os.mkdir(path)
        count=0
        files = DB.getExtFilenames()
        for f in files:
            shutil.copyfile(files[f], os.path.join(path, f))
            count+=1
        tkMessageBox.showinfo("Exported",
                             'Done. Exported %s files to\n%s'%(count,path))
        return

    def displayExtFiles(self, DB):
        """Display blobs in DB as web page links"""
        files = DB.getExtFilenames()
        print files
        if len(files) == 0:
            return
        items=[]
        for f in files:
            print f, files[f]
            items.append('<a href=%s>%s</a>' %(files[f],f)
                         )
        import markup
        page = markup.page( )
        page.init( title="PEATDB Files Preview",
                   css=( 'one.css' ),
                   header="Preview for project",
                   footer="PEATDB" )
        page.ul( class_='mylist' )
        page.li( items, class_='myitem' )
        page.ul.close()

        filename = '/tmp/prevtemp.html'
        hf = open(filename,'w')
        for c in page.content:
            hf.write(c)
        hf.close()
        import webbrowser
        webbrowser.open(filename, autoraise=1)
        return