class Gui(object): """ Gui for stopwatch """ def __init__(self, stopwatch): """ init stopwatch gui stopwatch:Stopwatch -> """ self.win = Window() # make window an attribute self.stopw = stopwatch # make stopwatch an attribute self.makeGui() # create gui def makeGui(self): """ create the Gui """ self.win.setTitle('Stopwatch v1.0') self.win.addStyle( 'r.TLabel', foreground='red', # create the styles font=('Helvetica', '30')) self.win.addStyle('g.TLabel', foreground='green', font=('Helvetica', '30')) self.win.addLabel('elapsed', 'Elapsed Time', style='r.TLabel') buttons = [('Start', self.startstop), ('Reset', self.reset), ('Exit', self.win.cancel)] # label and assign buttons self.win.addButton('buttons', cmd=buttons) # create buttons self.win.plot('elapsed', row=0) self.win.plot('buttons', row=1, pady=10) self.update() # update display def startstop(self): """ start or stop the stopwatch """ if self.stopw.running: self.stopw.stop() self.win.changeWidget('buttons', 0, text='Start') # relabel button self.win.changeWidget('elapsed', style='r.TLabel') # color display self.win.changeState('buttons', 1, ['!disabled']) # enable Reset else: self.stopw.start() self.win.changeWidget('buttons', 0, text='Stop') # relabel button self.win.changeWidget('elapsed', style='g.TLabel') # color display self.win.changeState('buttons', 1, ['disabled']) # disable Reset def reset(self): """ reset stopwatch """ self.stopw.reset() # reset it def update(self): """ update display """ etime = self.stopw.check() # get elapsed time template = '{:02}:{:02}:{:02}.{:02}' # 2 digits leading zero stime = template.format(*etime) # format as hh:mm:ss.cc self.win.set('elapsed', stime) # update display self.win.master.after(10, self.update) # call again after .01 sec
class Gui(object): """ the GUI for the script """ def __init__(self, mapper): """ create the interface """ self.mapper = mapper self.dialog = Window() self.dialog.setTitle('Mapper 1.0') # notebook tabs = ['Routine', 'Accumulate'] pages = self.dialog.addNotebook('notebook', tabs) # routine page self.routine = pages[0] today = datetime.date.today() self.dt = today.strftime('%d,%m,%Y,%B').split(',') self.routine.addEntry('title', 'Map Title', width=60) self.routine.set( 'title', '24 Hour Precipitation Ending 7 AM {0[3]} {0[0]}, {0[2]}'.format( self.dt)) self.routine.plot('title', row=0) self.routine.addEntry('outfile', 'Output Filename', width=40) self.routine.set('outfile', 'pcpn{0[1]}{0[0]}{0[2]}.png'.format(self.dt)) self.routine.plot('outfile', row=1) jobs = ['Make KMLs', 'Make Maps'] self.routine.addCheck('jobs', 'Jobs', jobs) self.routine.set('jobs', jobs[:2]) self.routine.plot('jobs', row=2) # accum pcpn page self.accum = pages[1] parms = [[2, 1, 12], [2, 1, 31], [4, 2000, 2100]] self.accum.addSpin('endDate', parms, '/', 'Ending Date', command=self.updateAccum) self.accum.set('endDate', [today.month, today.day, today.year]) self.accum.plot('endDate', row=0) self.accum.addSpin('daysBack', [[2, 1, 45]], '', 'Days back', command=self.updateAccum) self.accum.set('daysBack', [2]) self.accum.plot('daysBack', row=1) self.accum.addEntry('title', 'Title', width=60) self.accum.plot('title', row=2) self.accum.addEntry('outfile', 'Output Filename', width=40) self.accum.plot('outfile', row=3) self.updateAccum() # dialog self.dialog.addText('messages', 70, 15, 'Messages') self.dialog.plot('messages', row=1) self.dialog.addButton('commands', space=20) self.dialog.changeWidget('commands', 0, command=self.go) self.dialog.changeWidget('commands', 1, text='Exit') self.dialog.plot('commands', row=2) self.dialog.plot('notebook', row=0) self.dialog.set('notebook', 0) def updateAccum(self): """ update widgets on accum page """ end = self.accum.get('endDate') endDate = datetime.date(end[2], end[0], end[1]) endDateFmt = endDate.strftime('%d,%m,%Y,%B').split(',') daysBack = self.accum.get('daysBack')[0] self.accum.set( 'title', '{0} Day Precipitation Total Ending {1[3]} {1[0]}, {1[2]}'.format( int(daysBack), endDateFmt)) begDate = endDate - datetime.timedelta( int(self.accum.get('daysBack')[0]) - 1) begDateFmt = begDate.strftime('%d,%m').split(',') self.accum.set( 'outfile', 'accum{0[1]}{0[0]}-{1[1]}{1[0]}{1[2]}.png'.format( begDateFmt, endDateFmt)) def go(self): """ get current selected page and make map """ run = self.dialog.get('notebook') # get selected tab mapper = self.mapper(self) # create a Mapper instance using the Gui # instance which is self try: if run == 0: mapper.runRoutine() elif run == 1: mapper.runAccum() except: self.dialog.set('messages', self.dialog.catchExcept())
class Gui(object): def __init__(self): # read configuration file self.config = configparser.ConfigParser() self.config.read('config_parameters.ini') # write gui self.gui = Window() self.gui.setTitle('Export ScanInfo to Gsheet') self.gui.addChooseDir('dir_date', 'Scan Date Folder', width=40, initialdir='') self.gui.addEntry('para_list', 'Parameters to list', width=50) self.gui.addCombo('gdir', 'Save location in google drive', None, postcommand=self.gdir_update, width=47) self.gui.set('para_list', self.config['DEFAULT']['parameters']) self.gui.addText('status', width=40, height=5, prompt='Status:') self.gui.addCheck('auto_update', '', ['Turn On Auto Update']) self.gui.addButton('commands') self.gui.changeWidget('commands', 0, text='Export', command=self.export) self.gui.plot('dir_date', row=0) self.gui.plot('para_list', row=1, pady=5) self.gui.plot('gdir', row=2, pady=5) self.gui.plot('status', row=3, pady=10) self.gui.plot('auto_update', row=4) self.gui.plot('commands', row=5, pady=10) self.exported = False self.proj = None # bella project name self.g_name = None # google drive folder name self.g_ID = None # google drive folder id self.autoupdateOn = False self.update() def get_dirname_id(proj): '''Get the name and ID of google drive save locaion from google_dir.ini proj:''' config_g = configparser.ConfigParser() config_g.read('google_dir') name = [ config_g[i]['name'] for i in config_g.sections() if config_g[i]['proj'] == proj ] ID = [ config_g[i]['id'] for i in config_g.sections() if config_g[i]['proj'] == proj ] return name, ID def gdir_update(self): '''Update a saving location option on GUI, depending on your project''' # get BELLA project name dir_date = self.gui.get('dir_date', allValues=True) self.proj = get_proj_name(dir_date) # get google drive folder name and ID from .ini file cfg = configparser.ConfigParser() cfg.read('config_gdrive.ini') self.g_name = [ cfg[i]['name'] for i in cfg.sections() if cfg[i]['proj'] == self.proj ] self.g_ID = [ cfg[i]['id'] for i in cfg.sections() if cfg[i]['proj'] == self.proj ] # update save folder options in GUI self.gui.set('gdir', self.g_name, allValues=True) def export(self): '''When Export button is pressed, scan info is written into a google sheet''' # Get settings from GUI dir_date = self.gui.get('dir_date', allValues=True) # directory of scandata para_list = self.gui.get('para_list', allValues=True) # parameters to save gdrive_name = self.gui.get('gdir') # name of the google drive if not dir_date or not gdrive_name: self.gui.set('status', 'Please fill in all sections\n') else: gdrive_id = self.g_ID[self.g_name.index( gdrive_name)] # google drive ID sheet_title = self.proj + ' ' + os.path.basename( dir_date) + ' ScanSummary' # write self.scaninfo = scaninfo2gsheet(dir_date, para_list) sheet = self.scaninfo.write(gdrive_id, sheet_title) self.exported = True # add text to status window message = 'Gsheet \'' + sheet.title + '\' saved\nURL: ' + sheet.url self.gui.set('status', message) # update the config file self.write_config(para_list, dir_date) def update(self): '''Update google sheet every minute.''' if bool(self.gui.get('auto_update')) and self.exported: # if autoupdate is turned on, message appears on status window if not self.autoupdateOn: self.gui.set('status', '\nAuto update On...') self.autoupdateOn = True nscan_new = self.scaninfo.update() # if there is a new scan, add text to the status window if nscan_new: message = '\nScan ' + str(nscan_new) + ' updated' self.gui.set('status', message) else: # if autoupdate is turned off, message appears on status window if self.autoupdateOn: self.gui.set('status', '\nAuto update Off') self.autoupdateOn = False self.gui.master.after(30 * 1000, self.update) # wait for 30 seconds def write_config(self, para_list, dir_date): '''Save updated parameter list in config.ini file''' self.config['DEFAULT']['parameters'] = para_list with open('config_parameters.ini', 'w') as configfile: self.config.write(configfile)