def _add_labeled_dropdown(self, name, root, label="Entry:", values=None, default=None, width=5, position=(0, 0), **kwargs): "convenient wrapper for adding a Combobox" ttk.Label(root, text=label).grid(row=position[0], column=position[1], sticky='W') self.vars[name] = tk.StringVar() self.widgets[name] = ttk.Combobox(root, textvariable=self.vars[name], width=width, state='readonly') self.widgets[name].grid(row=position[0], column=position[1] + 1, **kwargs) self.widgets[name]['values'] = values if default is None: default = values[0] self.widgets[name].set(default)
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_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 __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) self.app = app # self.update_stats_var = tkinter.BooleanVar() self.update_stats_var.set(app.opt.update_player_stats != 0) self.confirm_var = tkinter.BooleanVar() self.confirm_var.set(app.opt.confirm != 0) self.win_animation_var = tkinter.BooleanVar() self.win_animation_var.set(app.opt.win_animation != 0) # frame = ttk.Frame(top_frame) frame.pack(expand=True, fill='both', padx=5, pady=10) widget = ttk.Label(frame, text=_("\nPlease enter your name"), takefocus=0) widget.grid(row=0, column=0, columnspan=2, sticky='ew', padx=0, pady=5) # w = kw.get("e_width", 30) # width in characters names = self.app.getAllUserNames() self.player_var = ttk.Combobox(frame, width=w, values=tuple(names)) self.player_var.current(names.index(app.opt.player)) self.player_var.grid(row=1, column=0, sticky='ew', padx=0, pady=5) # widget = ttk.Checkbutton(frame, variable=self.confirm_var, text=_("Confirm quit")) widget.grid(row=2, column=0, columnspan=2, sticky='ew', padx=0, pady=5) widget = ttk.Checkbutton(frame, variable=self.update_stats_var, text=_("Update statistics and logs")) widget.grid(row=3, column=0, columnspan=2, sticky='ew', padx=0, pady=5) # widget = ttk.Checkbutton(frame, variable=self.win_animation_var, # text="Win animation") # widget.pack(side='top', padx=kw.padx, pady=kw.pady) frame.columnconfigure(0, weight=1) # self.player = self.player_var.get() self.confirm = self.confirm_var.get() self.update_stats = self.update_stats_var.get() self.win_animation = self.win_animation_var.get() # focus = self.createButtons(bottom_frame, kw) self.mainloop(focus, kw.timeout)
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 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 get_widget(self, master): frame = FieldContainer(master) cbox = ttk.Combobox(frame, values=self.values, textvariable=self.var) cbox.grid(row=0, column=0, sticky='ew') ff = FormFrame(frame) ff.grid(row=1, column=0, sticky='ew') def changed(event=None): item = cbox.get() config_fields = self.item_dict[item] ff.ungrid_fields() ff.grid_fields(config_fields.values(), False) changed() cbox.bind('<<ComboboxSelected>>', changed) frame.columnconfigure(0, weight=1) return frame
def get_widget(self, master): return ttk.Combobox(master, values=self.values, textvariable=self.var)
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 _button_area(self): # grid layout # make expandable for col in range(5): self.button_frame.columnconfigure(col, weight=1) self.button_frame.rowconfigure(col, weight=1) # column 0 --------- # load image file button self.load = tk.Button(master=self.button_frame, text="load image", font=self.fontB, fg="dark blue", command=self._loadimage) self.load.grid(row=0, column=0, sticky=tk.W, padx=(5, 10), pady=(5, 0)) self.sample_image = ttk.Combobox(master=self.button_frame, font=self.font, values=[ "from file", "from transform", "sample dribinski", "sample Ominus" ], width=14, height=4) self.sample_image.current(0) self.sample_image.grid(row=1, column=0, padx=(5, 10)) # quit self.quit = tk.Button(master=self.button_frame, text="Quit", font=self.fontB, fg="dark red", command=self._quit) self.quit.grid(row=3, column=0, sticky=tk.W, padx=(5, 10), pady=(0, 5)) # column 1 ----------- # center image self.center = tk.Button(master=self.button_frame, text="center image", anchor=tk.W, font=self.fontB, fg="dark blue", command=self._center) self.center.grid(row=0, column=1, padx=(0, 20), pady=(5, 0)) self.center_method = ttk.Combobox(master=self.button_frame, font=self.font, values=center_methods, width=11, height=4) self.center_method.current(1) self.center_method.grid(row=1, column=1, padx=(0, 20)) # column 2 ----------- # Abel transform image self.recond = tk.Button(master=self.button_frame, text="Abel transform image", font=self.fontB, fg="dark blue", command=self._transform) self.recond.grid(row=0, column=2, padx=(0, 10), pady=(5, 0)) self.transform = ttk.Combobox(master=self.button_frame, values=Abel_methods, font=self.font, width=10, height=len(Abel_methods)) self.transform.current(2) self.transform.grid(row=1, column=2, padx=(0, 20)) self.direction = ttk.Combobox(master=self.button_frame, values=["inverse", "forward"], font=self.font, width=8, height=2) self.direction.current(0) self.direction.grid(row=2, column=2, padx=(0, 20)) # column 3 ----------- # speed button self.speed = tk.Button(master=self.button_frame, text="speed", font=self.fontB, fg="dark blue", command=self._speed) self.speed.grid(row=0, column=5, padx=20, pady=(5, 0)) self.speedclr = tk.Button(master=self.button_frame, text="clear plot", font=self.font, command=self._speed_clr) self.speedclr.grid(row=1, column=5, padx=20) # column 4 ----------- # anisotropy button self.aniso = tk.Button(master=self.button_frame, text="anisotropy", font=self.fontB, fg="dark blue", command=self._anisotropy) self.aniso.grid(row=0, column=6, pady=(5, 0)) self.subframe = tk.Frame(self.button_frame) self.subframe.grid(row=1, column=6) self.rmin = tk.Entry(master=self.subframe, text='rmin', width=3, font=self.font) self.rmin.grid(row=0, column=0) self.rmin.delete(0, tk.END) self.rmin.insert(0, self.rmx[0]) self.lbl = tk.Label(master=self.subframe, text="to", font=self.font) self.lbl.grid(row=0, column=1) self.rmax = tk.Entry(master=self.subframe, text='rmax', width=3, font=self.font) self.rmax.grid(row=0, column=2) self.rmax.delete(0, tk.END) self.rmax.insert(0, self.rmx[1]) # turn off button interface self.hide_buttons = tk.Button(master=self.button_frame, text="hide buttons", font=self.fontB, fg='grey', command=self._hide_buttons) self.hide_buttons.grid(row=3, column=6, sticky=tk.E, pady=(0, 20))
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)
root.destroy() # this is necessary on Windows to prevent # Fatal Python Error: PyEval_RestoreThread: NULL tstate # buttons with callbacks ---------------- # file input tk.Button(master=root, text='Load image file', command=_getfilename)\ .pack(anchor=tk.W) # image centering tk.Button(master=root, text='center image', command=_center).pack(anchor=tk.N) cent = ttk.Combobox(master=root, values=center_methods, state="readonly", width=11, height=len(center_methods)) cent.current(3) cent.place(anchor=tk.W, relx=0.65, rely=0.05) # display raw input image tk.Button(master=root, text='raw image', command=_display).pack(anchor=tk.W, padx=0.1) # Abel transform tk.Button(master=root, text='inverse Abel transform', command=_transform)\ .pack(anchor=tk.N) transform = ttk.Combobox(master=root, values=Abel_methods,
def initialize(self): """ Initialize the tKinter app (GUI) by creating frames and graphical components, setting the window size etc. """ # self.bind("<Escape>", lambda x: self.destroy()) self.bind("<Escape>", on_close) listFrame0 = Frame(self) listFrame0.pack(side=TOP, fill=BOTH, expand=True) listFrame = Frame(listFrame0) listFrame.pack(side=LEFT, fill=BOTH, expand=True) scrollbary = Scrollbar(listFrame, orient=VERTICAL) scrollbary.pack(side=RIGHT, fill=Y) scrollbarx = Scrollbar(listFrame, orient=HORIZONTAL) scrollbarx.pack(side=BOTTOM, fill=X) # bd --> border self.listbox = Listbox(listFrame, bd=1, selectmode=SINGLE, yscrollcommand=scrollbary.set, xscrollcommand=scrollbarx.set) self.listbox.bind('<<ListboxSelect>>', self.on_select_click) scrollbary.config(command=self.listbox.yview) scrollbarx.config(command=self.listbox.xview) self.listbox.config(width=self.listbox.winfo_reqwidth() // 3) # width=self.listbox.winfo_reqwidth() self.listbox.pack(side=LEFT, fill=BOTH, expand=True) listFrame1 = Frame(listFrame0) listFrame1.pack(side=LEFT, fill=BOTH, expand=True) scrollbary1 = Scrollbar(listFrame1, orient=VERTICAL) scrollbary1.pack(side=RIGHT, fill=Y) scrollbarx1 = Scrollbar(listFrame1, orient=HORIZONTAL) scrollbarx1.pack(side=BOTTOM, fill=X) # bd --> border self.listbox1 = Listbox(listFrame1, bd=0, selectmode=SINGLE, yscrollcommand=scrollbary1.set, xscrollcommand=scrollbarx1.set) self.listbox1.bind('<<ListboxSelect>>', self.on_update_select_click) scrollbary1.config(command=self.listbox1.yview) scrollbarx1.config(command=self.listbox1.xview) self.listbox1.config(width=self.listbox1.winfo_reqwidth() // 2) # width=self.listbox.winfo_reqwidth() self.listbox1.pack(side=LEFT, fill=BOTH, expand=True) text_frame = Frame(self) text_frame.pack(fill=X) # ,expand=True) self.created_str = tk.StringVar() created = tk.Entry(text_frame, textvariable=self.created_str) self.created_months = ttk.Combobox(text_frame) self.created_months['values'] = ('01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12') self.created_months.set(datetime.date.today().strftime('%m')) self.created_months.state(['readonly']) # self.created_months.bind('<<ComboboxSelected>>', self.On_table_select) self.value_str = tk.StringVar() value = tk.Entry(text_frame, textvariable=self.value_str) self.category_str = tk.StringVar() category = tk.Entry(text_frame, textvariable=self.category_str) # , state='readonly') self.description_str = tk.StringVar() description = tk.Entry(text_frame, textvariable=self.description_str) fill_from_csv_button = Button(text_frame, text="fill from csv") fill_from_csv_button.bind('<Button-1>', self.on_fill_from_csv_click) self.db_tables = ttk.Combobox(text_frame) self.db_tables.state(['readonly']) self.db_tables.bind('<<ComboboxSelected>>', self.on_table_select) created.pack(side=LEFT) self.created_months.pack(side=LEFT) value.pack(side=LEFT) category.pack(side=LEFT) description.pack(side=LEFT) # check.pack(side=LEFT) fill_from_csv_button.pack(side=LEFT) self.db_tables.pack(side=LEFT) button_frame = Frame(self) button_frame.pack(fill=X) # ,expand=True) save_button = Button(button_frame, text="save entry") save_button.bind('<Button-1>', self.on_save_entry_click) database_button = Button(button_frame, text="select database") database_button.bind('<Button-1>', self.on_database_click) self.database_path_str = tk.StringVar() self.database_path = tk.Label(button_frame, textvariable=self.database_path_str, bg="white", anchor=tk.W) save_button.pack(side=LEFT) database_button.pack(side=RIGHT) self.database_path.pack(side=RIGHT) # , expand=True, fill=BOTH fill=BOTH, debugFrame = Frame(self) debugFrame.pack(side=BOTTOM, fill=X) # ,expand=True) self.last_entry = tk.StringVar() self.path_label = tk.Label(debugFrame, textvariable=self.last_entry, bg="white", anchor=tk.W) self.path_label.pack(side=LEFT, fill=BOTH, expand=True) # print self.geometry() self.update() # self.geometry(self.geometry()) # self.update() # print self.geometry() # fix the size of the window by setting the window size to its own size w = self.winfo_screenwidth() # print w # print 'reqwidth',self.winfo_reqwidth() # h = self.winfo_screenheight() self.geometry('{0}x{1}+{2}+{3}'.format(self.winfo_reqwidth(), self.winfo_reqheight() * 3, w - self.winfo_reqwidth() - 20, 0)) # self.geometry() self.update() self.minsize(self.winfo_reqwidth(), self.winfo_reqheight())