Пример #1
0
class PipeApp(Frame, GUI_help):
    """Data pipe GUI for importing and fitting of raw data.
       This class uses ekin provided an automated pipeline for fitting
       raw text data files and propagating errors.
       Uses a config file to store the pipeline settings"""

    def __init__(self, parent=None, rawfile=None, conffile=None):

        self.parent=parent
        if not self.parent:
            Frame.__init__(self)
            self.main=self.master
        else:
            self.main=Toplevel()
            self.master=self.main
        self.main.title('DataPipeline Desktop')
        ws = self.main.winfo_screenwidth()
        hs = self.main.winfo_screenheight()
        w = 800; h=600
        x = (ws/2)-(w/2); y = (hs/2)-(h/2)
        self.main.geometry('%dx%d+%d+%d' % (w,h,x,y))
        self.main.protocol('WM_DELETE_WINDOW',self.quit)

        #pipeline object is used for everything except gui stuff
        self.p = Pipeline(conffile)
        self.setupVars()
        self.setupGUI()
        #redirect stdout to log win
        self.log.delete(1.0,END)
        sys.stdout = self
        #sys.stderr = self
        return

    def setupVars(self):
        """tk vars"""
        self.conffilevar = StringVar()
        self.queuefilesvar = IntVar()
        self.currfilevar = StringVar()
        return

    def setupGUI(self):
        """Do GUI elements"""
        self.createMenuBar()
        self.infopane = Frame(self.main,height=20)
        self.infopane.pack(side=BOTTOM,fill=BOTH,pady=4)
        self.updateinfoPane()
        Label(self.infopane,text='Conf file:').pack(side=LEFT)
        Label(self.infopane,textvariable=self.conffilevar,fg='darkblue').pack(side=LEFT,padx=4)
        Label(self.infopane,text='Files in queue:').pack(side=LEFT,padx=4)
        Label(self.infopane,textvariable=self.queuefilesvar,fg='darkblue').pack(side=LEFT)
        Label(self.infopane,text='Current file:').pack(side=LEFT,padx=4)
        Label(self.infopane,textvariable=self.currfilevar,fg='darkblue').pack(side=LEFT)
        self.m = PanedWindow(self.main,
                           orient=HORIZONTAL,
                           sashwidth=3,
                           showhandle=True)
        self.m1 = PanedWindow(self.m,
                           orient=VERTICAL,
                           sashwidth=3,
                           showhandle=True)
        self.m2 = PanedWindow(self.m,
                           orient=VERTICAL,
                           sashwidth=3,
                           showhandle=True)
        self.m.pack(side=TOP,fill=BOTH,expand=1)
        self.m.add(self.m1)
        self.rawcontents = Pmw.ScrolledText(self.m1,
                labelpos = 'n',
                label_text='Raw File Contents',
                rowheader=1,
                columnheader=1,
                Header_foreground = 'blue',
                rowheader_width = 3,
                usehullsize = 1,
                hull_width = 500,
                hull_height = 300,
                text_wrap='none')
        self.m1.add(self.rawcontents)
        self.previewer = PlotPreviewer(self.m1,app=self)
        self.m1.add(self.previewer)
        self.m.add(self.m2)
        self.queueFrame = queueManager(app=self)
        self.m2.add(self.queueFrame)
        self.log = Pmw.ScrolledText(self.m2,
                labelpos = 'n',
                label_text='Logs',
                usehullsize = 1,
                hull_width = 400,
                hull_height = 500,
                text_wrap='word')
        self.m2.add(self.log)
        return

    def updateinfoPane(self):
        if hasattr(self.p, 'configurationfile'):
            self.conffilevar.set(self.p.configurationfile)
        self.queuefilesvar.set(len(self.p.queue))
        self.currfilevar.set(self.p.filename)
        return

    def createMenuBar(self):
        """Create the menu bar for the application. """
        self.menu=Menu(self.main)
        self.file_menu={'01Open Raw File(s)':{'cmd':self.openRaw},
                         '02Load Config File':{'cmd':self.loadConfig},
                         '03Edit Current Config':{'cmd':self.editConfig},
                         '04Create Config':{'cmd':self.createConfig},
                         '05Quit':{'cmd':self.quit}}
        self.file_menu=self.create_pulldown(self.menu,self.file_menu)
        self.menu.add_cascade(label='File',menu=self.file_menu['var'])
        self.project_menu={'01Load Project':{'cmd': self.loadProject},
                            '02Save Project':{'cmd': self.saveProject}}
        self.project_menu=self.create_pulldown(self.menu,self.project_menu)
        self.menu.add_cascade(label='Project',menu=self.project_menu['var'])
        self.run_menu={'01Execute':{'cmd': self.execute}}
        self.run_menu=self.create_pulldown(self.menu,self.run_menu)
        self.menu.add_cascade(label='Run',menu=self.run_menu['var'])
        self.queue_menu={'01Add files to queue':{'cmd': self.addtoQueue},
                          '02Add folder to queue':{'cmd': self.addFolder},
                          '03Clear queue':{'cmd': self.clearQueue}}
        self.queue_menu=self.create_pulldown(self.menu,self.queue_menu)
        self.menu.add_cascade(label='Queue',menu=self.queue_menu['var'])
        self.utils_menu={'01Show Config Helper':{'cmd': self.launchHelper},
                         '02Model Design':{'cmd': self.launchModelDesigner},
                         '03Launch Ekin':{'cmd':self.openEkin},
                         '04Text Editor':{'cmd': self.startTextEditor},
                         '05Batch File Rename':{'cmd': self.batchFileRename},
                         '06Clear Log':{'cmd': self.clearLog},
                         '07Run Tests':{'cmd': self.runTests}}
        self.utils_menu=self.create_pulldown(self.menu,self.utils_menu)
        self.menu.add_cascade(label='Utilities',menu=self.utils_menu['var'])
        self.help_menu={ '01Online Help':{'cmd': self.help},
                          '02About':{'cmd': self.about},}
        self.help_menu=self.create_pulldown(self.menu,self.help_menu)
        self.menu.add_cascade(label='Help',menu=self.help_menu['var'])
        self.main.config(menu=self.menu)
        return

    def openRaw(self, filename=None):
        """Open a raw file, if more than one file we add them to queue"""
        if filename==None:
            filename = self.openFilename()
        if not os.path.exists(filename): return
        #now we open the first file only
        lines = self.p.openRaw(filename)
        self.updateinfoPane()
        self.showRawFile(lines)
        self.showPreview()
        return

    def createConfig(self):
        filename = self.saveFilename()
        if filename:
            self.p.createConfig(filename)
        return

    def loadConfig(self, filename=None):
        if filename == None:
            filename = self.openFilename('conf')
        if not filename: return
        self.p.parseConfig(filename)
        self.updateinfoPane()
        return

    def reloadConfig(self):
        self.loadConfig(self.p.configurationfile)
        return

    def editConfig(self):
        self.editFile(self.p.configurationfile)
        return

    def editFile(self, filename=None):
        """Edit a file"""
        if filename==None:
            filename = self.openFilename('conf')
        if not filename:
            return

        tf = TextEditor(parent=self,title=filename)
        tf.openFile(filename)
        tf.addFunction('Reload Config', self.reloadConfig)
        return

    def showRawFile(self, lines):
        """Show raw file contents"""

        c = self.rawcontents
        c.delete("1.0",END)
        c.component('columnheader').delete("1.0",END)
        c.component('rowheader').delete("1.0",END)
        count=0
        for row in range(0, len(lines)):
            if type(lines[row]) is types.StringType:
                line = string.strip(lines[row])
            else:
                line = lines[row]
            c.insert(END,'%s\n' %line)
            c.component('rowheader').insert(END, str(count)+'\n')
            count=count+1

        return

    def stopCurrent(self):
        self.p.stop = True
        print 'cancel pressed.. please wait'
        return

    def execute(self):
        """Run current files in queue"""
        if len(self.p.queue) == 0:
            return
        from Dialogs import ProgressDialog
        signal=True

        self.pb = ProgressDialog(self.main, cancel=self.stopCurrent)
        self.pb.after(100, self.pb.updateValue())
        self.p.run(callback=self.pb.updateValue)
        self.pb.close()
        return

    def showPreview(self,lines=None):
        """Show how the data looks with the import formatting applied"""
        self.previewer.update()
        return

    def addtoQueue(self, files=None):
        """Add files"""
        if files==None:
            files = self.openFilenames()
        self.p.addtoQueue(files)
        self.updateinfoPane()
        self.queueFrame.update()
        return

    def updateFromQueue(self):
        """Check current file open after a queue deletion"""
        if self.p.filename not in self.p.queue.values():
            self.clearCurrentFile()
        return

    def clearCurrentFile(self):
        """Clear current file"""
        self.p.closeFile()
        self.updateinfoPane()
        self.rawcontents.clear()
        self.previewer.clear()
        return

    def addFolder(self, path=None):
        if path==None:
            path = self.openDirectory()
        self.p.addFolder(path)
        self.updateinfoPane()
        self.queueFrame.update()
        return

    def clearQueue(self):
        self.queueFrame.clear()
        return

    def runTests(self):
        """Run tests"""
        import Testing
        Testing.formatTests(Testing.basictests)
        print 'tests completed ok'
        return

    def openEkin(self, fname=None):
        """Open ekin"""
        EK = EkinApp(parent=self)
        return

    def launchModelDesigner(self):
        self.modelapp = ModelDesignApp(parent=self)
        if self.p.modelsfile != '':
            self.modelapp.loadModelsFile(self.p.modelsfile)
        return

    def launchHelper(self):
        wz = HelperDialog(parent=self)
        return

    def openFilename(self, ext=['txt','csv','xls']):
        if not type(ext) is types.ListType:
            ext=[ext]
        filetypes=[]
        for e in ext:
            filetypes.append(('%s files' %e,'*.%s' %e))
        filetypes.append(("All files","*.*"))
        filename=tkFileDialog.askopenfilename(defaultextension=ext,
                                              initialdir=self.p.savedir,
                                              filetypes=filetypes,
                                              parent=self.main)
        return filename

    def openFilenames(self, ext='txt'):
        filetypes = [('%s files' %ext,'*.%s' %ext)]
        filetypes.append(("All files","*.*"))
        filename=tkFileDialog.askopenfilenames(defaultextension=ext,
                                              initialdir=self.p.savedir,
                                              filetypes=filetypes,
                                              parent=self.main)
        return filename

    def saveFilename(self, ext=''):
        if ext!='':
            filetypes = [('%s files' %ext,'*.%s' %ext)]
        else:
            filetypes = []
        filetypes.append(("All files","*.*"))
        filename=tkFileDialog.asksaveasfilename(defaultextension='.'+ext,
                                              initialdir=self.p.savedir,
                                              filetypes=filetypes,
                                              parent=self.main)
        return filename

    def openDirectory(self):
        folder = tkFileDialog.askdirectory(parent=self.main,
                                            initialdir=os.getcwd(),
                                            title='Select folder')
        return folder

    def loadProject(self, filename=None):
        if filename == None:
            filename = self.openFilename('proj')
        f = open(filename,'r')
        try:
            self.p = pickle.load(f)
        except Exception,e:
            print 'failed to load project'
            print 'Error returned:', e
            return
        print 'loaded project', filename
        name = os.path.splitext(filename)[1]
        self.p.writeConfig(filename='%s.conf' %name)
        self.updateinfoPane()
        self.queueFrame.update()
        self.previewer.update()
        if self.p.lines != None:
            self.showRawFile(self.p.lines)
        return
Пример #2
0
 def launchModelDesigner(self):
     self.modelapp = ModelDesignApp(parent=self)
     if self.p.modelsfile != '':
         self.modelapp.loadModelsFile(self.p.modelsfile)
     return