Exemplo n.º 1
0
    def make_widgets(self):
        title = ttk.Label(self, text='Scan Settings', font='TkHeadingFont',
                          anchor=CENTER)
        title.grid(row=0, column=0, pady=7, sticky=W+E)

        nameframe = ttk.Frame(self)
        ttk.Label(nameframe, text='Sample Name: ').grid(row=0, column=0, pady=3,
                  padx=(5,0))
        self.samplename = ttk.Entry(nameframe)
        self.samplename.grid(row=0, column=1, columnspan=4, padx=(0,5))
        ttk.Label(nameframe, text='ROI: ').grid(row=1, column=0, sticky=E)
        self.roistart = FloatEntry(nameframe, width=5)
        self.roistart.grid(row=1, column=1, sticky=W, pady=3)
        ttk.Label(nameframe, text=' to ').grid(row=1, column=2)
        self.roiend = FloatEntry(nameframe, width=5)
        self.roiend.grid(row=1, column=3)
        ttk.Label(nameframe, text=' keV').grid(row=1, column=4, sticky=E)
        nameframe.grid(row=2, column=0, pady=3, padx=5)

        scantypeframe = ttk.Frame(self)
        ttk.Label(scantypeframe, text='Scan Type: ').pack(side=LEFT)
        self.scantype = StringVar()
        self.scantype.trace('w', self.change_scan_type)
        scantypes = ['Single Spectrum', 'Linear Scan', 'Grid Scan']
        scansel = ttk.Combobox(scantypeframe, values=scantypes, width=13,
                               textvar=self.scantype, state='readonly')
        scansel.bind('<<ComboboxSelected>>', lambda x: scansel.selection_clear())
        scansel.pack(side=LEFT)
        scantypeframe.grid(row=3, column=0, pady=5, padx=5)

        self.paramframe = ttk.Frame(self)
        self.paramframe.grid(row=4, column=0, pady=3, padx=5, sticky='nswe')
        self.paramframe.config(borderwidth=1, relief=SUNKEN)
        self.paramframe.rowconfigure(0, weight=1)
        self.rowconfigure(4, minsize=115)
        self.gridset = GridScanSettings(self.paramframe)
        self.linset = LinearScanSettings(self.paramframe, self.sio)
        self.specset = SpectrumSettings(self.paramframe)
        self.scantype.set('Single Spectrum')
        for var in (self.gridset.variables.values() +
                    self.linset.variables.values() +
                    self.specset.variables.values()):
            var.trace('w', self.check_if_ready)

        buttons = ttk.Frame(self)
        self.startbutt = ttk.Button(buttons, text='Start', state=DISABLED)
        self.startbutt.pack(side=LEFT, expand=1)
        self.stopbutt = ttk.Button(buttons, text='Stop')
        self.stopbutt.pack(side=LEFT, expand=1)
        self.savebutt = ttk.Button(buttons, text='Save Scan')
        self.savebutt.pack(side=RIGHT, expand=1)
        buttons.grid(column=0, row=5, pady=3, padx=5, sticky='nswe')

        self.columnconfigure(0, weight=1)
        for r in (0,3,4):
            self.rowconfigure(r, weight=1)
Exemplo n.º 2
0
    def make_widgets(self):
        acctimeframe = ttk.Frame(self)
        ttk.Label(acctimeframe, text='Acc time: ').pack(side=LEFT)
        accent = FloatEntry(acctimeframe, width=5,
                            textvariable=self.variables['acctime'])
        accent.pack(side=LEFT)
        ttk.Label(acctimeframe, text=' s/pt').pack(side=LEFT)
        acctimeframe.pack(side=TOP, fill=BOTH, expand=1, pady=3)

        stepsizeframe = ttk.Frame(self)
        ttk.Label(stepsizeframe, text='Step size: ').pack(side=LEFT)
        self.stepsize = StringVar()
        stepent = FloatEntry(stepsizeframe, width=5,
                             textvariable=self.variables['stepsize'])
        stepent.pack(side=LEFT)
        ttk.Label(stepsizeframe, text=' mm').pack(side=LEFT)
        stepsizeframe.pack(side=TOP, fill=BOTH, expand=1, pady=3)

        gridsizeframe = ttk.Frame(self)
        vals = ['{0}x{0}'.format(i).center(6) for i in range(3, 13, 2)]
        ttk.Label(gridsizeframe, text='Grid size: ').pack(side=LEFT)
        gridsizesel = ttk.Combobox(gridsizeframe, values=vals, width=5,
            state='readonly')
        def gridcallback(*_):
            curr = gridsizesel.get()
            gridsize = int(curr.split('x')[0])
            self.variables['gridsize'].set(gridsize)
            gridsizesel.selection_clear()
        gridsizesel.bind('<<ComboboxSelected>>', gridcallback)
        gridsizesel.pack(side=LEFT)
        gridsizeframe.pack(side=TOP, fill=BOTH, expand=1, pady=3)
Exemplo n.º 3
0
 def make_widgets(self):
     name = ttk.Label(self, text=self.motor.name, width=3)
     name.grid(column=0, row=0, sticky=E, padx=(5, 1))
     pos = ttk.Label(self,
                     textvariable=self.current_pos,
                     width=11,
                     anchor=E)
     pos.grid(column=1, row=0, padx=2)
     self.goto = FloatEntry(self, width=7)
     self.goto.grid(column=2, row=0, padx=2)
     self.goto.bind('<KeyPress-KP_Enter>', self.move)  #numpad Enter key
     self.goto.bind('<KeyPress-Return>', self.move)  #keyboard Enter key
     self.zerobutt = ttk.Button(self,
                                text='Zero',
                                command=self.motor.zero_here,
                                width=5)
     self.zerobutt.grid(column=4, row=0, padx=5)
Exemplo n.º 4
0
    def make_widgets(self):
        acctimeframe = ttk.Frame(self)
        ttk.Label(acctimeframe, text='Acc time: ').pack(side=LEFT)
        acctime = FloatEntry(acctimeframe, width=5,
                             textvariable=self.variables['acctime'])
        acctime.pack(side=LEFT)
        ttk.Label(acctimeframe, text=' sec').pack(side=LEFT)
        acctimeframe.pack(side=TOP, fill=BOTH, expand=1, pady=3)

        chanframe = ttk.Frame(self)
        ttk.Label(chanframe, text='MCA Channels: ').pack(side=LEFT)
        vals = [256, 512, 1024, 2048, 4096, 8192]
        chansel = ttk.Combobox(chanframe, values=vals, state='readonly',
            textvariable=self.variables['chans'], width=4)
        chansel.bind('<<ComboboxSelected>>',
                     lambda x: chansel.selection_clear())
        chansel.pack(side=LEFT)
        chanframe.pack(side=TOP, fill=BOTH, expand=1, pady=3)
Exemplo n.º 5
0
    def make_widgets(self):
        self.reset_values()
        title = ttk.Label(self, text="Basic", font='TkHeadingFont')
        title.grid(column=0, row=0, columnspan=3, pady=7)
        ttk.Label(self, text='Gain: ').grid(row=1, column=0, sticky=E)
        FloatEntry(self, textvar=self.variables['GAIN'],
                   width=7).grid(row=1, column=1, pady=2)

        ttk.Label(self, text='Peaking time (us): ').grid(row=2,
                                                         column=0,
                                                         sticky=E)
        FloatEntry(self, textvar=self.variables['TPEA'],
                   width=7).grid(row=2, column=1, pady=2)

        ttk.Label(self, text='Slow threshold (%): ').grid(row=3,
                                                          column=0,
                                                          sticky=E)
        FloatEntry(self, textvar=self.variables['THSL'],
                   width=7).grid(row=3, column=1, pady=2)

        ttk.Label(self, text='Fast threshold: ').grid(row=4,
                                                      column=0,
                                                      sticky=E)
        FloatEntry(self, textvar=self.variables['THFA'],
                   width=7).grid(row=4, column=1, pady=2)

        ttk.Label(self, text='TEC set point (K): ').grid(row=5,
                                                         column=0,
                                                         sticky=E)
        FloatEntry(self, textvar=self.variables['TECS'],
                   width=7).grid(row=5, column=1, pady=2)

        ttk.Button(self, text='Reset',
                   command=self.reset_values).grid(row=7, column=0)
        ttk.Button(self, text='Apply',
                   command=self.send_values).grid(row=7,
                                                  column=1,
                                                  pady=7,
                                                  padx=(0, 4))
Exemplo n.º 6
0
class SingleMotorWidget(ttk.Frame):
    """Base class for control widgets for a single motor.

    Attributes:
        motor (blcontrol.stages.Motor): The motor controlled by this widget.
        current_pos (tk.StringVar): A string variable containing the motor's
            current position with real units.
        goto (ttk.Entry): Input for position to which the motor will be moved.
        checkjob: An `after` loop to continually update the motor's position
            data.
    """
    def __init__(self, parent, motor, **options):
        ttk.Frame.__init__(self, parent, **options)
        self.motor = motor
        self.current_pos = StringVar()
        self.make_widgets()
        self.check_queue()

    def make_widgets(self):
        name = ttk.Label(self, text=self.motor.name, width=3)
        name.grid(column=0, row=0, sticky=E, padx=(5, 1))
        pos = ttk.Label(self,
                        textvariable=self.current_pos,
                        width=11,
                        anchor=E)
        pos.grid(column=1, row=0, padx=2)
        self.goto = FloatEntry(self, width=7)
        self.goto.grid(column=2, row=0, padx=2)
        self.goto.bind('<KeyPress-KP_Enter>', self.move)  #numpad Enter key
        self.goto.bind('<KeyPress-Return>', self.move)  #keyboard Enter key
        self.zerobutt = ttk.Button(self,
                                   text='Zero',
                                   command=self.motor.zero_here,
                                   width=5)
        self.zerobutt.grid(column=4, row=0, padx=5)

    def check_queue(self):
        """Loop to check the position queue for new data every 50ms."""
        try:
            newpos = self.motor.get_tracking_pos()
        except Queue.Empty:
            pass
        else:
            self.update_pos(newpos)
        self.checkjob = self.after(50, self.check_queue)

    def disable(self):
        """Adds home button and disables entry."""
        self.goto.configure(state='disabled')
        self.zerobutt.configure(text='Home', command=self.home_and_reenable)
        self.after_cancel(self.checkjob)
        self.current_pos.set('')

    def home_and_reenable(self):
        """Restores pos info and enables entry."""
        self.motor.send(com.HOME)
        self.motor.get_reply(com.HOME)
        self.goto.configure(state='normal')
        self.zerobutt.configure(text='Zero', command=self.motor.zero_here)
        self.motor.send(com.POS)
        self.check_queue()
Exemplo n.º 7
0
    def make_widgets(self):
        motselframe = ttk.Frame(self)
        ttk.Label(motselframe, text='Motor: ').pack(side=LEFT)
        motornames = self.stageio.motors.keys()
        self.motorsel = ttk.Combobox(motselframe, width=3, state='readonly',
            textvariable=self.variables['motorname'], values=motornames)
        self.motorsel.bind('<<ComboboxSelected>>', self.change_unit)
        self.motorsel.pack(side=LEFT)
        motselframe.pack(side=TOP, fill=BOTH, expand=1, pady=3)

        acctimeframe = ttk.Frame(self)
        ttk.Label(acctimeframe, text='Acc time: ').pack(side=LEFT)
        self.acctime = StringVar()
        accent = FloatEntry(acctimeframe, width=5,
                            textvariable=self.variables['acctime'])
        accent.pack(side=LEFT)
        ttk.Label(acctimeframe, text=' s/pt').pack(side=LEFT)
        acctimeframe.pack(side=TOP, fill=BOTH, expand=1, pady=3)

        stepsizeframe = ttk.Frame(self)
        ttk.Label(stepsizeframe, text='Step size: ').pack(side=LEFT)
        self.stepsize = StringVar()
        stepent = FloatEntry(stepsizeframe, width=5,
                             textvariable=self.variables['stepsize'])
        stepent.pack(side=LEFT)        
        lab = ttk.Label(stepsizeframe, textvariable=self.stepunit)
        lab.pack(side=LEFT)
        stepsizeframe.pack(side=TOP, fill=BOTH, expand=1, pady=3)

        extframe = ttk.Frame(self)
        ttk.Label(extframe, text='Extent: ').pack(side=LEFT)
        self.start = StringVar()
        startent = FloatEntry(extframe, width=7,
                              textvariable=self.variables['start'])
        startent.pack(side=LEFT)
        ttk.Label(extframe, text=' to ').pack(side=LEFT)
        self.end = StringVar()
        endent = FloatEntry(extframe, width=7,
                            textvariable=self.variables['end'])
        endent.pack(side=LEFT)
        lab2 = ttk.Label(extframe, textvariable=self.stepunit)
        lab2.pack(side=LEFT)
        extframe.pack(side=TOP, fill=BOTH, expand=1, pady=3)
Exemplo n.º 8
0
class SettingsFrame(ttk.Frame):
    """Contains settings for each type of scans as well as common settings."""
    
    def __init__(self, parent, sio, **options):
        ttk.Frame.__init__(self, parent, **options)
        self.sio = sio
        self.make_widgets()
        
    def make_widgets(self):
        title = ttk.Label(self, text='Scan Settings', font='TkHeadingFont',
                          anchor=CENTER)
        title.grid(row=0, column=0, pady=7, sticky=W+E)

        nameframe = ttk.Frame(self)
        ttk.Label(nameframe, text='Sample Name: ').grid(row=0, column=0, pady=3,
                  padx=(5,0))
        self.samplename = ttk.Entry(nameframe)
        self.samplename.grid(row=0, column=1, columnspan=4, padx=(0,5))
        ttk.Label(nameframe, text='ROI: ').grid(row=1, column=0, sticky=E)
        self.roistart = FloatEntry(nameframe, width=5)
        self.roistart.grid(row=1, column=1, sticky=W, pady=3)
        ttk.Label(nameframe, text=' to ').grid(row=1, column=2)
        self.roiend = FloatEntry(nameframe, width=5)
        self.roiend.grid(row=1, column=3)
        ttk.Label(nameframe, text=' keV').grid(row=1, column=4, sticky=E)
        nameframe.grid(row=2, column=0, pady=3, padx=5)

        scantypeframe = ttk.Frame(self)
        ttk.Label(scantypeframe, text='Scan Type: ').pack(side=LEFT)
        self.scantype = StringVar()
        self.scantype.trace('w', self.change_scan_type)
        scantypes = ['Single Spectrum', 'Linear Scan', 'Grid Scan']
        scansel = ttk.Combobox(scantypeframe, values=scantypes, width=13,
                               textvar=self.scantype, state='readonly')
        scansel.bind('<<ComboboxSelected>>', lambda x: scansel.selection_clear())
        scansel.pack(side=LEFT)
        scantypeframe.grid(row=3, column=0, pady=5, padx=5)

        self.paramframe = ttk.Frame(self)
        self.paramframe.grid(row=4, column=0, pady=3, padx=5, sticky='nswe')
        self.paramframe.config(borderwidth=1, relief=SUNKEN)
        self.paramframe.rowconfigure(0, weight=1)
        self.rowconfigure(4, minsize=115)
        self.gridset = GridScanSettings(self.paramframe)
        self.linset = LinearScanSettings(self.paramframe, self.sio)
        self.specset = SpectrumSettings(self.paramframe)
        self.scantype.set('Single Spectrum')
        for var in (self.gridset.variables.values() +
                    self.linset.variables.values() +
                    self.specset.variables.values()):
            var.trace('w', self.check_if_ready)

        buttons = ttk.Frame(self)
        self.startbutt = ttk.Button(buttons, text='Start', state=DISABLED)
        self.startbutt.pack(side=LEFT, expand=1)
        self.stopbutt = ttk.Button(buttons, text='Stop')
        self.stopbutt.pack(side=LEFT, expand=1)
        self.savebutt = ttk.Button(buttons, text='Save Scan')
        self.savebutt.pack(side=RIGHT, expand=1)
        buttons.grid(column=0, row=5, pady=3, padx=5, sticky='nswe')

        self.columnconfigure(0, weight=1)
        for r in (0,3,4):
            self.rowconfigure(r, weight=1)

    def change_scan_type(self, *_):
        """Toggles scan settings between different types of scans."""
        value = self.scantype.get()
        for child in self.paramframe.winfo_children():
            #child.clear_widgets()
            child.grid_forget()
        if value == 'Single Spectrum':
            self.curr_scan = self.specset
        elif value == 'Linear Scan':
            self.curr_scan = self.linset
        elif value == 'Grid Scan':
            self.curr_scan = self.gridset
        self.curr_scan.grid(row=0, column=0, pady=3, padx=5)

    def get_scan_params(self):
        """Returns a dictionary of scan parameters."""
        params = self.curr_scan.get_params()
        roistart = self.roistart.get()
        roiend = self.roiend.get()
        if roistart and roiend:
            roi = (float(self.roistart.get()), float(self.roiend.get()))
        else:
            roi = None
        params['roi'] = roi
        params['samplename'] = self.samplename.get()
        return params
        
    def check_if_ready(self, *_):
        if self.curr_scan.is_ready():
            self.startbutt.config(state=NORMAL)
        else:
            self.startbutt.config(state=DISABLED)