def _add_labeled_entry(self, name, root, label="Entry:", value="", width=5, position=(0, 0), postlabel=None, **kwargs): "convenient wrapper for adding an Entry" ttk.Label(root, text=label).grid(row=position[0], column=position[1], sticky='W') self.vars[name] = tk.StringVar() self.widgets[name] = ttk.Entry(root, textvariable=self.vars[name], width=width) self.widgets[name].insert(0, value) self.widgets[name].grid(row=position[0], column=position[1] + 1, **kwargs) if postlabel is not None: ttk.Label(root, text=postlabel).grid(row=position[0], column=position[1] + 2, sticky='W')
def make_expts_fields(self, frame, template, boxes): """Create a related group of fields for an experiment section.""" for i, field in enumerate(template): self.make_label(frame, field, row=i + 1, sticky='ne') if isinstance(template[field], collections.Mapping): # Another nesting level! boxes[field] = {} subframe = ttk.Frame(frame) for j, subfield in enumerate(template[field]): self.make_label(subframe, subfield, row=j, sticky='e') boxes[field][subfield] = ttk.Entry(subframe, width=40) boxes[field][subfield].grid(row=j, column=1, sticky='w') subframe.grid(row=i + 1, column=1, sticky='we') else: boxes[field] = ttk.Entry(frame, width=70) boxes[field].grid(row=i + 1, column=1, sticky='w')
def body(self, master): tk.Label(master, text='Connection name:').grid(row=0) tk.Label(master, text='Catalog type:').grid(row=1) tk.Label(master, text='Root path:').grid(row=2) self.name = ttk.Entry(master) self.name.grid(row=0, column=1, sticky='ew') self.name.insert(0, self.connection_name) self.catalog_cbox = ttk.Combobox(master, values=config.catalog_types) self.catalog_cbox.grid(row=1, column=1, sticky='ew') self.catalog_cbox.set(self.catalog_type) self.root_path_entry = tk.Entry(master) self.root_path_entry.grid(row=2, column=1, sticky='ew') self.root_path_entry.insert(0, self.root_path) self.isdefault_var = tk.IntVar() self.isdefault_var.set(self.isdefault) self.set_default = tk.Checkbutton(master, text='make default connection', variable=self.isdefault_var) self.set_default.grid(row=3, column=1) self.catalog_config_frame = tk.Frame(master) self.catalog_config_frame.grid(row=4, sticky='nsew') self.catalog_type_changed(catalog_config=self.catalog_config) self.catalog_cbox.bind('<<ComboboxSelected>>', self.catalog_type_changed) self.result = None
def make_people_tab(self, parent): """Build the people tab and add it to the parent.""" frame = ttk.Frame(parent) # Choosing who to edit ttk.Label(frame, text='Edit person:').grid(row=0, column=0, sticky='e') person_list = ttk.Combobox(frame, state='readonly', width=10, values=sorted( self.metadata['people'].keys())) person_list.bind('<<ComboboxSelected>>', lambda e: self.update_people_tab(person_list.get())) person_list.grid(row=0, column=1, sticky='w') # Section for adding new people ttk.Label(frame, text='New person:').grid(row=2, column=0, sticky='e') new_person_var = T.StringVar() ttk.Entry(frame, textvariable=new_person_var, width=10).grid(row=2, column=1, sticky='w') # TODO: Make hitting return in the Entry click the Add button # TODO: Make the Add button stick next to the Entry box ttk.Button(frame, text='Add', command=lambda: self.add_person(new_person_var.get( ), person_list)).grid(row=2, column=2, sticky='w') # Fields to edit current person widgets = self.session_widgets = {} ttk.Label(frame, text='Full name:').grid(row=0, column=4, sticky='e') widgets['name'] = ttk.Entry(frame) widgets['name'].grid(row=0, column=5, sticky='w') ttk.Label(frame, text='ORCID:').grid(row=1, column=4, sticky='e') widgets['orcid'] = ttk.Entry(frame) widgets['orcid'].grid(row=1, column=5, sticky='w') ttk.Label(frame, text='SCOPUS ID:').grid(row=2, column=4, sticky='e') widgets['scopus_id'] = ttk.Entry(frame) widgets['scopus_id'].grid(row=2, column=5, sticky='w') if self.metadata['people']: person_list.set(person_list['values'][0]) self.update_people_tab(person_list.get()) # Resize support frame.rowconfigure('all', weight=0) frame.columnconfigure(0, weight=2) frame.columnconfigure(3, weight=1) frame.columnconfigure(6, weight=2) parent.add(frame, text='People') return frame
def __init__(self, parent, title, label, value, **kw): kw = self.initKw(kw) MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) # self.value = value if label: label = ttk.Label(top_frame, text=label, takefocus=0) label.pack(pady=5) w = kw.get("e_width", 0) # width in characters self.var = ttk.Entry(top_frame, exportselection=1, width=w) self.var.insert(0, value) self.var.pack(side='top', padx=kw.padx, pady=kw.pady) # focus = self.createButtons(bottom_frame, kw) focus = self.var self.mainloop(focus, kw.timeout)
def body(self, master): a = 'e' tk.Label(master, text='Connection name:', anchor=a).grid(row=0, sticky='ew') tk.Label(master, text='Catalog type:', anchor=a).grid(row=1, sticky='ew') tk.Label(master, text='Root path:', anchor=a).grid(row=2, sticky='ew') tk.Label(master, text='Default connection:', anchor=a).grid(row=3, sticky='ew') self.name = ttk.Entry(master) self.name.grid(row=0, column=1, sticky='ew') self.name.insert(0, self.connection_name) self.name.focus_set() self.catalog_cbox = ttk.Combobox(master, state='readonly', values=config.catalog_types + []) self.catalog_cbox.grid(row=1, column=1, sticky='ew') self.catalog_cbox.set(self.catalog_type) self.root_path_entry = tk.Entry(master) self.root_path_entry.grid(row=2, column=1, sticky='ew') self.root_path_entry.insert(0, self.root_path) self.isdefault_var = tk.IntVar() self.isdefault_var.set(self.isdefault) self.set_default = tk.Checkbutton(master, variable=self.isdefault_var, anchor='w') self.set_default.grid(row=3, column=1, sticky='ew') self.catalog_config_frame = tk.Frame(master) self.catalog_config_frame.grid(row=4, column=1, sticky='nsew') self.catalog_type_changed(catalog_config=self.catalog_config) self.catalog_cbox.bind('<<ComboboxSelected>>', self.catalog_type_changed) self.result = None return self.name
def make_session_tab(self, parent): """Build a tab for setting session properties.""" frame = ttk.Frame(parent) ttk.Label(frame, text='Description:').grid(row=2, column=0, sticky='e') desc = ttk.Entry(frame, width=70) desc.grid(row=2, column=1, sticky='w') ttk.Label(frame, text='Researcher:').grid(row=0, column=0, sticky='e') researcher = ttk.Combobox(frame, state='readonly', values=sorted( self.metadata['people'].keys())) researcher.bind( '<<ComboboxSelected>>', lambda e: self.update_session( person=researcher.get(), expt=experiment, desc=desc)) researcher.grid(row=0, column=1, sticky='w') self.session_researcher_box = researcher ttk.Label(frame, text='Experiment:').grid(row=1, column=0, sticky='e') experiment = ttk.Combobox(frame, state='readonly', values=sorted( self.metadata['experiments'].keys())) experiment.bind( '<<ComboboxSelected>>', lambda e: self.update_session(person=researcher.get(), expt=experiment.get())) experiment.grid(row=1, column=1, sticky='w') self.session_experiment_box = experiment if 'last_session' not in self.metadata: self.metadata['last_session'] = T.StringVar() self.metadata['last_session'].set(researcher['values'][0]) last_person = self.metadata['last_session'].get() researcher.set(last_person) self.update_session(person=researcher.get(), desc=desc, expt=experiment) # Resize support & add to tabs frame.rowconfigure('all', weight=0) frame.columnconfigure('all', weight=1) parent.add(frame, text='This session') return frame
def _label_entry(_lbl, _txt, _row, is_password=False, width=None, **gridpos): l = ttk.Label(self._frame, text=_lbl) l.grid(column=0, row=_row, sticky='W', padx=5, pady=5, **gridpos) sv = tk.StringVar() sv.set(_txt or '') sve = ttk.Entry(self._frame, textvariable=sv, show="*" if is_password else None, width=width) sve.grid(column=1, row=_row, padx=5, pady=5, sticky="EW", **gridpos) return sv, sve
def __init__(self, parent, title, init_font, **kw): # print init_font kw = self.initKw(kw) MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) self.font_family = 'Helvetica' self.font_size = 12 self.font_weight = 'normal' self.font_slant = 'roman' if init_font is not None: assert 2 <= len(init_font) <= 4 assert isinstance(init_font[1], int) self.font_family, self.font_size = init_font[:2] if len(init_font) > 2: if init_font[2] in ['bold', 'normal']: self.font_weight = init_font[2] elif init_font[2] in ['italic', 'roman']: self.font_slant = init_font[2] else: raise ValueError('invalid font style: ' + init_font[2]) if len(init_font) > 3: if init_font[3] in ['bold', 'normal']: self.font_weight = init_font[3] elif init_font[2] in ['italic', 'roman']: self.font_slant = init_font[3] else: raise ValueError('invalid font style: ' + init_font[3]) # self.family_var = tkinter.StringVar() self.weight_var = tkinter.BooleanVar() self.weight_var.set(self.font_weight == 'bold') self.slant_var = tkinter.BooleanVar() self.slant_var.set(self.font_slant == 'italic') self.size_var = tkinter.IntVar() self.size_var.set(self.font_size) # frame = ttk.Frame(top_frame) frame.pack(expand=True, fill='both', padx=5, pady=10) frame.columnconfigure(0, weight=1) # frame.rowconfigure(1, weight=1) self.entry = ttk.Entry(frame) self.entry.grid(row=0, column=0, columnspan=2, sticky='news') self.entry.insert('end', _('abcdefghABCDEFGH')) self.list_box = tkinter.Listbox(frame, width=36, exportselection=False) sb = ttk.Scrollbar(frame) self.list_box.configure(yscrollcommand=sb.set) sb.configure(command=self.list_box.yview) self.list_box.grid(row=1, column=0, sticky='news') # rowspan=4 sb.grid(row=1, column=1, sticky='ns') bind(self.list_box, '<<ListboxSelect>>', self.fontupdate) # self.list_box.focus() cb1 = ttk.Checkbutton(frame, text=_('Bold'), command=self.fontupdate, variable=self.weight_var) cb1.grid(row=2, column=0, columnspan=2, sticky='we') cb2 = ttk.Checkbutton(frame, text=_('Italic'), command=self.fontupdate, variable=self.slant_var) cb2.grid(row=3, column=0, columnspan=2, sticky='we') sc = PysolScale(frame, from_=6, to=40, resolution=1, label=_('Size:'), orient='horizontal', command=self.fontupdate, variable=self.size_var) sc.grid(row=4, column=0, columnspan=2, sticky='news') # font_families = list(tkinter_font.families()) font_families.sort() selected = -1 n = 0 self.list_box.insert('end', *font_families) for font in font_families: if font.lower() == self.font_family.lower(): selected = n break n += 1 if selected >= 0: self.list_box.select_set(selected) self.list_box.see(selected) # focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout) self.font = (self.font_family, self.font_size, self.font_slant, self.font_weight)
def __init__(self, parent, title, app, **kw): kw = self.initKw(kw) MfxDialog.__init__(self, parent, title, kw.resizable, kw.default) top_frame, bottom_frame = self.createFrames(kw) self.createBitmaps(top_frame, kw) frame = ttk.Frame(top_frame) frame.pack(expand=True, fill='both', padx=10, pady=10) frame.columnconfigure(0, weight=1) notebook = ttk.Notebook(frame) notebook.pack(expand=True, fill='both') for w in WizardWidgets: if isinstance(w, six.string_types): frame = ttk.Frame(notebook) notebook.add(frame, text=w, sticky='nsew', padding=5) frame.columnconfigure(1, weight=1) row = 0 continue ttk.Label(frame, text=w.label).grid(row=row, column=0) if w.widget == 'preset': if w.variable is None: w.variable = tkinter.StringVar() values = [_(v) for v in w.values] default = _(w.default) values.remove(default) values.sort() values.insert(0, default) def callback(e, w=w): self.presetSelected(e, w) cb = PysolCombo(frame, values=tuple(values), textvariable=w.variable, exportselection=False, selectcommand=callback, state='readonly', width=32) cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2) elif w.widget == 'entry': if w.variable is None: w.variable = tkinter.StringVar() en = ttk.Entry(frame, textvariable=w.variable) en.grid(row=row, column=1, sticky='ew', padx=2, pady=2) elif w.widget == 'menu': if w.variable is None: w.variable = tkinter.StringVar() values = [_(v) for v in w.values] cb = PysolCombo(frame, values=tuple(values), textvariable=w.variable, exportselection=False, state='readonly', width=32) cb.grid(row=row, column=1, sticky='ew', padx=2, pady=2) elif w.widget == 'spin': if w.variable is None: w.variable = tkinter.IntVar() else: # delete all trace callbacks for mod, cbname in w.variable.trace_vinfo(): w.variable.trace_vdelete(mod, cbname) from_, to = w.values # s = Spinbox( # frame, textvariable=w.variable, from_=from_, to=to) s = PysolScale(frame, from_=from_, to=to, resolution=1, orient='horizontal', variable=w.variable) s.grid(row=row, column=1, sticky='ew', padx=2, pady=2) elif w.widget == 'check': if w.variable is None: w.variable = tkinter.BooleanVar() ch = ttk.Checkbutton(frame, variable=w.variable, takefocus=False) ch.grid(row=row, column=1, sticky='ew', padx=2, pady=2) if w.current_value is None: v = w.default else: v = w.current_value if w.widget in ('menu', 'preset'): v = _(v) w.variable.set(v) row += 1 focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout)
def __init__(self, *args, **kwargs): ttk.Frame.__init__(self, *args, **kwargs) self.init_settings() self.cookie = cookielib.MozillaCookieJar(self.cookie_filename) if (os.path.isfile(self.cookie_filename)): self.cookie.load(ignore_discard=True, ignore_expires=True) self.opener = urllib.request.build_opener( urllib.request.HTTPCookieProcessor(self.cookie)) self.students = [] self.username = StringVar() self.password = StringVar() self.course_listvar = StringVar() self.assignment_listvar = StringVar() self.student_listvar = StringVar() ttk.Label(self, text='Username: '******'Password: '******'*') self.password_entry.grid(column=2, row=2, sticky=(W, E)) self.login_button = ttk.Button(self, text='Login', command=self.login) self.login_button.grid(column=2, row=3, stick=E) self.course_listbox = Listbox(self, height=6, width=35, listvariable=self.course_listvar, relief='sunken') self.course_listbox.grid(column=3, row=1, rowspan=3, padx=(5, 0), stick=(N, W, E, S)) self.course_listbox.configure(exportselection=False) self.course_listbox.bind('<<ListboxSelect>>', self.load_assignments) s = ttk.Scrollbar(self, orient=VERTICAL, command=self.course_listbox.yview) s.grid(column=4, row=1, rowspan=3, sticky=(N, S)) self.course_listbox['yscrollcommand'] = s.set self.assignment_listbox = Listbox(self, height=6, width=35, listvariable=self.assignment_listvar, relief='sunken') self.assignment_listbox.grid(column=5, row=1, rowspan=3, padx=(5, 0), stick=(N, W, E, S)) self.assignment_listbox.configure(exportselection=False) self.assignment_listbox.bind('<<ListboxSelect>>', self.load_students) s = ttk.Scrollbar(self, orient=VERTICAL, command=self.assignment_listbox.yview) s.grid(column=6, row=1, rowspan=3, sticky=(N, S)) self.assignment_listbox['yscrollcommand'] = s.set self.student_listbox = Listbox(self, height=20, listvariable=self.student_listvar, relief='sunken', font=font.Font(family='Consolas', size=11)) self.student_listbox.grid(column=1, row=4, columnspan=5, pady=(10, 5), stick=(N, W, E, S)) self.student_listbox.configure(exportselection=False) s = ttk.Scrollbar(self, orient=VERTICAL, command=self.student_listbox.yview) s.grid(column=6, row=4, pady=(10, 5), sticky=(N, S)) self.student_listbox['yscrollcommand'] = s.set self.readtxt_button = ttk.Button(self, text='读入成绩', command=self.read_txt) self.readtxt_button.grid(column=1, row=5, stick=E) self.dopublish_button = ttk.Button(self, text='确认发布', command=self.do_publish) self.dopublish_button.grid(column=2, row=5, stick=W) self.exportcsv_button = ttk.Button(self, text='导出成绩', command=self.export_csv) self.exportcsv_button.grid(column=3, row=5, stick=E) self.grid_columnconfigure(5, weight=1) self.grid_rowconfigure(4, weight=1) self.try_load_courses()
def make_expts_tab(self, parent): """Build a tab for setting experiment info.""" expt_frame = ttk.Frame(parent) # Control pane along the top frame = ttk.Frame(expt_frame) ttk.Label(frame, text='Edit experiment:').grid(row=0, column=0, sticky='e') experiment = ttk.Combobox(frame, state='readonly', width=15, values=sorted( self.metadata['experiments'].keys())) experiment.bind( '<<ComboboxSelected>>', lambda e: self.update_expts_tab(expt_id=experiment.get())) experiment.grid(row=0, column=1, sticky='w') self.experiment_shown = None self.experiment_selector = experiment ttk.Label(frame, text='Clone experiment as:').grid(row=1, column=0, sticky='e') clone_var = T.StringVar() ttk.Entry(frame, textvariable=clone_var, width=15).grid(row=1, column=1, sticky='we') self.clone_expt_button = ttk.Button( frame, text='Clone', command=lambda: self.add_expt(clone_var.get(), clone=experiment.get())) self.clone_expt_button.grid(row=1, column=2, sticky='w') if not self.metadata['experiments']: self.clone_expt_button.state(['disabled']) ttk.Label(frame, text='Add experiment:').grid(row=2, column=0, sticky='e') add_var = T.StringVar() ttk.Entry(frame, textvariable=add_var, width=15).grid(row=2, column=1, sticky='we') ttk.Button(frame, text='Add', command=lambda: self.add_expt(add_var.get())).grid( row=2, column=2, sticky='w') frame.columnconfigure(0, weight=1) # Expand at the sides frame.columnconfigure(3, weight=1) frame.pack(side='top', fill='x', expand=True) # Experiment property editing below the control pane; frame per 'item', # all in a scrolling canvas self.expts_canvas = canvas = T.Canvas(expt_frame, borderwidth=0) canvas.pack(side='left', fill='both', expand=True) frame = ttk.Frame(canvas) scrollbar = ttk.Scrollbar(expt_frame, orient='vertical', command=canvas.yview) scrollbar.pack(side='right', fill='y') canvas.configure(yscrollcommand=scrollbar.set) canvas.create_window((0, 0), window=frame, anchor='nw') frame.bind("<Configure>", self.on_expts_frame_configure) # The contents self.expts_boxes = {} self.make_expts_part(frame, 'description') self.make_expts_part(frame, 'optophysiology') self.make_stim_frame(frame) for part in [ 'data_collection', 'pharmacology', 'protocol', 'slices', 'stimulus', 'subject', 'surgery', 'virus', 'related_publications', 'notes' ]: self.make_expts_part(frame, part) # Show current experiment, if any if self.metadata['experiments']: experiment.set(experiment['values'][0]) self.update_expts_tab(expt_id=experiment.get()) # Add to tabs parent.add(expt_frame, text='Experiments') return expt_frame
def _create_widgets(self): """Create a nice GUI using the enhanced widget set provided by the ttk extension to Tkinter, available in Python 2.7 or newer """ #---- create the GUIs insts = ['NIRCam', 'NIRSpec', 'NIRISS', 'MIRI', 'FGS'] self.root = tk.Tk() self.root.geometry('+50+50') self.root.title("James Webb Space Telescope PSF Calculator") frame = ttk.Frame(self.root) #frame = ttk.Frame(self.root, padx=10,pady=10) #ttk.Label(frame, text='James Webb PSF Calculator' ).grid(row=0) #-- star lf = ttk.LabelFrame(frame, text='Source Properties') if _HAS_PYSYNPHOT: self._add_labeled_dropdown("SpType", lf, label=' Spectral Type:', values=poppy.specFromSpectralType( "", return_list=True), default='G0V', width=25, position=(0, 0), sticky='W') ttk.Button(lf, text='Plot spectrum', command=self.ev_plotspectrum).grid(row=0, column=2, sticky='E', columnspan=4) r = 1 fr2 = ttk.Frame(lf) self._add_labeled_entry("source_off_r", fr2, label=' Source Position: r=', value='0.0', width=5, position=(r, 0), sticky='W') self._add_labeled_entry("source_off_theta", fr2, label='arcsec, PA=', value='0', width=3, position=(r, 2), sticky='W') self.vars["source_off_centerpos"] = tk.StringVar() self.vars["source_off_centerpos"].set('corner') ttk.Label(fr2, text='deg, centered on ').grid(row=r, column=4) pixel = ttk.Radiobutton(fr2, text='pixel', variable=self.vars["source_off_centerpos"], value='pixel') pixel.grid(row=r, column=5) corner = ttk.Radiobutton(fr2, text='corner', variable=self.vars["source_off_centerpos"], value='corner') corner.grid(row=r, column=6) fr2.grid(row=r, column=0, columnspan=5, sticky='W') lf.columnconfigure(2, weight=1) lf.grid(row=1, sticky='E,W', padx=10, pady=5) #-- instruments lf = ttk.LabelFrame(frame, text='Instrument Config') notebook = ttk.Notebook(lf) self.widgets['tabset'] = notebook notebook.pack(fill='both') for iname, i in zip(insts, range(len(insts))): page = ttk.Frame(notebook) notebook.add(page, text=iname) notebook.select(i) # make it active self.widgets[notebook.select( )] = iname # save reverse lookup from meaningless widget "name" to string name if iname == 'NIRCam': lframe = ttk.Frame(page) ttk.Label(lframe, text='Configuration Options for ' + iname + ', module: ').grid(row=0, column=0, sticky='W') mname = 'NIRCam module' self.vars[mname] = tk.StringVar() self.widgets[mname] = ttk.Combobox( lframe, textvariable=self.vars[mname], width=2, state='readonly') self.widgets[mname].grid(row=0, column=1, sticky='W') self.widgets[mname]['values'] = ['A', 'B'] self.widgets[mname].set('A') lframe.grid(row=0, columnspan=2, sticky='W') else: ttk.Label(page, text='Configuration Options for ' + iname + " ").grid(row=0, columnspan=2, sticky='W') ttk.Button(page, text='Display Optics', command=self.ev_displayOptics).grid(column=2, row=0, sticky='E', columnspan=3) #if iname != 'TFI': self._add_labeled_dropdown( iname + "_filter", page, label=' Filter:', values=self.instrument[iname].filter_list, default=self.instrument[iname].filter, width=12, position=(1, 0), sticky='W') #else: #ttk.Label(page, text='Etalon wavelength: ' , state='disabled').grid(row=1, column=0, sticky='W') #self.widgets[iname+"_wavelen"] = ttk.Entry(page, width=7) #, disabledforeground="#A0A0A0") #self.widgets[iname+"_wavelen"].insert(0, str(self.instrument[iname].etalon_wavelength)) #self.widgets[iname+"_wavelen"].grid(row=1, column=1, sticky='W') #ttk.Label(page, text=' um' ).grid(row=1, column=2, sticky='W') #self.vars[iname+"_filter"] = tk.StringVar() #self.widgets[iname+"_filter"] = ttk.Combobox(page,textvariable =self.vars[iname+"_filter"], width=10, state='readonly') #self.widgets[iname+"_filter"]['values'] = self.instrument[iname].filter_list #self.widgets[iname+"_filter"].set(self.instrument[iname].filter) #self.widgets[iname+"_filter"]['readonly'] = True #ttk.Label(page, text=' Filter: ' ).grid(row=1, column=0) #self.widgets[iname+"_filter"].grid(row=1, column=1) #if hasattr(self.instrument[iname], 'ifu_wavelength'): if iname == 'NIRSpec' or iname == 'MIRI': fr2 = ttk.Frame(page) #label = 'IFU' if iname !='TFI' else 'TF' ttk.Label(fr2, text=' IFU wavelen: ', state='disabled').grid(row=0, column=0) self.widgets[iname + "_ifu_wavelen"] = ttk.Entry( fr2, width=5) #, disabledforeground="#A0A0A0") self.widgets[iname + "_ifu_wavelen"].insert( 0, str(self.instrument[iname].monochromatic)) self.widgets[iname + "_ifu_wavelen"].grid(row=0, column=1) self.widgets[iname + "_ifu_wavelen"].state(['disabled']) ttk.Label(fr2, text=' um', state='disabled').grid(row=0, column=2) fr2.grid(row=1, column=2, columnspan=6, sticky='E') iname2 = iname + "" # need to make a copy so the following lambda function works right: self.widgets[iname + "_filter"].bind( '<<ComboboxSelected>>', lambda e: self.ev_update_ifu_label(iname2)) if len(self.instrument[iname].image_mask_list) > 0: masks = self.instrument[iname].image_mask_list masks.insert(0, "") self._add_labeled_dropdown(iname + "_coron", page, label=' Coron:', values=masks, width=12, position=(2, 0), sticky='W') #self.vars[iname+"_coron"] = tk.StringVar() #self.widgets[iname+"_coron"] = ttk.Combobox(page,textvariable =self.vars[iname+"_coron"], width=10, state='readonly') #self.widgets[iname+"_coron"]['values'] = masks #ttk.Label(page, text=' Coron: ' ).grid(row=2, column=0) #self.widgets[iname+"_coron"].set(self.widgets[iname+"_coron"]['values'][0]) #self.widgets[iname+"_coron"].grid(row=2, column=1) #fr2 = ttk.Frame(page) #self.vars[iname+"_cor_off_r"] = tk.StringVar() #self.vars[iname+"_cor_off_theta"] = tk.StringVar() #ttk.Label(fr2, text='target offset: r=' ).grid(row=2, column=4) #self.widgets[iname+"_cor_off_r"] = ttk.Entry(fr2,textvariable =self.vars[iname+"_cor_off_r"], width=5) #self.widgets[iname+"_cor_off_r"].insert(0,"0.0") #self.widgets[iname+"_cor_off_r"].grid(row=2, column=5) #ttk.Label(fr2, text='arcsec, PA=' ).grid(row=2, column=6) #self.widgets[iname+"_cor_off_theta"] = ttk.Entry(fr2,textvariable =self.vars[iname+"_cor_off_theta"], width=3) #self.widgets[iname+"_cor_off_theta"].insert(0,"0") #self.widgets[iname+"_cor_off_theta"].grid(row=2, column=7) #ttk.Label(fr2, text='deg' ).grid(row=2, column=8) #fr2.grid(row=2,column=3, sticky='W') if len(self.instrument[iname].image_mask_list) > 0: masks = self.instrument[iname].pupil_mask_list masks.insert(0, "") self._add_labeled_dropdown(iname + "_pupil", page, label=' Pupil:', values=masks, width=12, position=(3, 0), sticky='W') fr2 = ttk.Frame(page) self._add_labeled_entry(iname + "_pupilshift_x", fr2, label=' pupil shift in X:', value='0', width=3, position=(3, 4), sticky='W') self._add_labeled_entry(iname + "_pupilshift_y", fr2, label=' Y:', value='0', width=3, position=(3, 6), sticky='W') ttk.Label(fr2, text='% of pupil').grid(row=3, column=8) fr2.grid(row=3, column=3, sticky='W') ttk.Label(page, text='Configuration Options for the OTE').grid( row=4, columnspan=2, sticky='W') fr2 = ttk.Frame(page) opd_list = self.instrument[iname].opd_list opd_list.insert(0, "Zero OPD (perfect)") #if os.getenv("WEBBPSF_ITM") or 1: if self._enable_opdserver: opd_list.append("OPD from ITM Server") default_opd = self.instrument[iname].pupilopd if self.instrument[ iname].pupilopd is not None else "Zero OPD (perfect)" self._add_labeled_dropdown(iname + "_opd", fr2, label=' OPD File:', values=opd_list, default=default_opd, width=21, position=(0, 0), sticky='W') self._add_labeled_dropdown(iname + "_opd_i", fr2, label=' # ', values=[str(i) for i in range(10)], width=3, position=(0, 2), sticky='W') self.widgets[iname + "_opd_label"] = ttk.Label( fr2, text=' 0 nm RMS ', width=35) self.widgets[iname + "_opd_label"].grid(column=4, sticky='W', row=0) self.widgets[iname + "_opd"].bind( '<<ComboboxSelected>>', lambda e: self.ev_update_OPD_labels()) # The below code does not work, and I can't tell why. This only ever has iname = 'FGS' no matter which instrument. # So instead brute-force it with the above to just update all 5. #lambda e: self.ev_update_OPD_label(self.widgets[iname+"_opd"], self.widgets[iname+"_opd_label"], iname) ) ttk.Button(fr2, text='Display', command=self.ev_displayOPD).grid(column=5, sticky='E', row=0) fr2.grid(row=5, column=0, columnspan=4, sticky='S') # ITM interface here - build the widgets now but they will be hidden by default until the ITM option is selected fr2 = ttk.Frame(page) self._add_labeled_entry(iname + "_coords", fr2, label=' Source location:', value='0, 0', width=12, position=(1, 0), sticky='W') units_list = ['V1,V2 coords', 'detector pixels'] self._add_labeled_dropdown(iname + "_coord_units", fr2, label='in:', values=units_list, default=units_list[0], width=11, position=(1, 2), sticky='W') choose_list = [ '', 'SI center', 'SI upper left corner', 'SI upper right corner', 'SI lower left corner', 'SI lower right corner' ] self._add_labeled_dropdown(iname + "_coord_choose", fr2, label='or select:', values=choose_list, default=choose_list[0], width=21, position=(1, 4), sticky='W') ttk.Label(fr2, text=' ITM output:').grid(row=2, column=0, sticky='W') self.widgets[iname + "_itm_output"] = ttk.Label( fr2, text=' - no file available yet -') self.widgets[iname + "_itm_output"].grid(row=2, column=1, columnspan=4, sticky='W') ttk.Button(fr2, text='Access ITM...', command=self.ev_launch_ITM_dialog).grid(column=5, sticky='E', row=2) fr2.grid(row=6, column=0, columnspan=4, sticky='SW') self.widgets[iname + "_itm_coords"] = fr2 self.ev_update_OPD_labels() lf.grid(row=2, sticky='E,W', padx=10, pady=5) notebook.select(0) lf = ttk.LabelFrame(frame, text='Calculation Options') r = 0 self._add_labeled_entry('FOV', lf, label='Field of View:', width=3, value='5', postlabel='arcsec/side', position=(r, 0)) r += 1 self._add_labeled_entry( 'detector_oversampling', lf, label='Output Oversampling:', width=3, value='2', postlabel='x finer than instrument pixels ', position=(r, 0)) #self.vars['downsamp'] = tk.BooleanVar() #self.vars['downsamp'].set(True) #self.widgets['downsamp'] = ttk.Checkbutton(lf, text='Save in instr. pixel scale, too?', onvalue=True, offvalue=False,variable=self.vars['downsamp']) #self.widgets['downsamp'].grid(row=r, column=4, sticky='E') output_options = [ 'Oversampled PSF only', 'Oversampled + Detector Res. PSFs', 'Mock full image from JWST DMS' ] self._add_labeled_dropdown("output_type", fr2, label='Output format:', values=output_options, default=output_options[1], width=31, position=(r, 4), sticky='W') r += 1 self._add_labeled_entry('fft_oversampling', lf, label='Coronagraph FFT Oversampling:', width=3, value='2', postlabel='x finer than Nyquist', position=(r, 0)) r += 1 self._add_labeled_entry('nlambda', lf, label='# of wavelengths:', width=3, value='', position=(r, 0), postlabel='Leave blank for autoselect') r += 1 self._add_labeled_dropdown("jitter", lf, label='Jitter model:', values=[ 'Just use OPDs', 'Gaussian - 7 mas rms', 'Gaussian - 30 mas rms' ], width=20, position=(r, 0), sticky='W', columnspan=2) r += 1 self._add_labeled_dropdown("output_format", lf, label='Output Format:', values=[ 'Oversampled image', 'Detector sampled image', 'Both as FITS extensions', 'Mock JWST DMS Output' ], width=30, position=(r, 0), sticky='W', columnspan=2) #self._add_labeled_dropdown("jitter", lf, label='Jitter model:', values= ['Just use OPDs', 'Gaussian blur', 'Accurate yet SLOW grid'], width=20, position=(r,0), sticky='W', columnspan=2) lf.grid(row=4, sticky='E,W', padx=10, pady=5) lf = ttk.Frame(frame) def addbutton(self, lf, text, command, pos, disabled=False): self.widgets[text] = ttk.Button(lf, text=text, command=command) self.widgets[text].grid(column=pos, row=0, sticky='E') if disabled: self.widgets[text].state(['disabled']) addbutton(self, lf, 'Compute PSF', self.ev_calc_psf, 0) addbutton(self, lf, 'Display PSF', self.ev_displayPSF, 1, disabled=True) addbutton(self, lf, 'Display profiles', self.ev_displayProfiles, 2, disabled=True) addbutton(self, lf, 'Save PSF As...', self.ev_SaveAs, 3, disabled=True) addbutton(self, lf, 'More options...', self.ev_options, 4, disabled=False) ttk.Button(lf, text='Quit', command=self.quit).grid(column=5, row=0) lf.columnconfigure(2, weight=1) lf.columnconfigure(4, weight=1) lf.grid(row=5, sticky='E,W', padx=10, pady=15) frame.grid(row=0, sticky='N,E,S,W') frame.columnconfigure(0, weight=1) frame.rowconfigure(0, weight=1) self.root.columnconfigure(0, weight=1) self.root.rowconfigure(0, weight=1)