def get_user_input_gui(): submit_flag = False log_records_dir = logging_options['log_records_dir'] log_records_dir_browse = (Path.cwd(), log_records_dir)[Path(log_records_dir).is_dir()] quiet_console = logging_options['quiet_console'] console_level = logging_options['console_level'] enable_console_file = logging_options['enable_console_file'] console_file_name = logging_options['console_file_name'] enable_verbose_file = logging_options['enable_verbose_file'] verbose_level = logging_options['verbose_level'] verbose_file_name = logging_options['verbose_file_name'] layout = [[sg.Text('Quiet Console:', size=(14, 1)), sg.Check(text='', default=quiet_console, key='-CONSOLE LOGGING-', pad=(2, 1)), sg.Text('Will not display in the console. Will still output in console log if enabled')], [sg.Text('Console Logging:', size=(14, 1)), sg.Check(text='', default=enable_console_file, key='-CONSOLE FILE-', pad=(2, 1)), sg.Text('Level:'), sg.Combo(default_value=console_level, values=['DEBUG', 'INFO', 'WARNING', 'ERROR'], size=(10, 0), key='-CONSOLE LEVEL-'), sg.Text('Console File Name:', size=(14, 1)), sg.InputText(key='-CONSOLE FILE NAME-', default_text=console_file_name)], [sg.Text('Verbose Logging:', size=(14, 1)), sg.Check(text='', default=enable_verbose_file, key='-VERBOSE FILE-', pad=(2, 1)), sg.Text('Level:'), sg.Combo(default_value=verbose_level, values=['DEBUG', 'INFO', 'WARNING', 'ERROR'], size=(10, 0), key='-VERBOSE LEVEL-'), sg.Text('Verbose File Name:', size=(14, 1)), sg.InputText(key='-VERBOSE NAME-', default_text=verbose_file_name)], [sg.Text('Log File Directory:', size=(14, 1)), sg.InputText(key='-lOG DIR-', default_text=log_records_dir, size=(84, 0)), sg.FolderBrowse(button_text='...', target='-lOG DIR-', initial_folder=log_records_dir_browse, pad=(1, 0))], [sg.Submit(), sg.Cancel()]] window = sg.Window('Setup Logging', layout) while True: event, values = window.read() # End program if user closes window or # presses the Cancel button if event == "Cancel" or event == sg.WIN_CLOSED: break if "Submit" in event: logging_options['log_records_dir'] = values['-lOG DIR-'] logging_options['quiet_console'] = values['-CONSOLE LOGGING-'] logging_options['console_level'] = values['-CONSOLE LEVEL-'] logging_options['enable_console_file'] = values['-CONSOLE FILE-'] logging_options['console_file_name'] = values['-CONSOLE FILE NAME-'] logging_options['enable_verbose_file'] = values['-VERBOSE FILE-'] logging_options['verbose_level'] = values['-VERBOSE LEVEL-'] logging_options['verbose_file_name'] = values['-VERBOSE NAME-'] with open(logging_options_fn, 'w') as opt_file: toml.dump(logging_options, opt_file) submit_flag = True break window.close() return submit_flag
def _create_layout(self): """Create a layout that matches the rack""" layout = [[sg.Text('Select, Port, Activity, Light', size=(20,1))]] for port_number in self.rack.ports: row = [sg.Check(text = None, key='_C{}_'.format(port_number), enable_events=True), sg.Text('Port {}'.format(port_number)), LEDIndicator('_A{}_'.format(port_number)), LEDIndicator('_LED{}_'.format(port_number)), ] layout.append(row) # Finally append the exit botton layout.append([sg.Button('Exit')]) return layout
def start_scorer_windows(): scorer_layout = [[ Sg.Text("Current Question:"), Sg.Text("N/A", key="current_question"), Sg.Text("Question Value:"), Sg.Text("0000", key="question_value") ], [Sg.Text(" + - Other")]] for i in range(len(players)): scorer_layout.append([ Sg.Text(players[i] + ":"), Sg.Radio("", group_id="player_{}".format(i + 1), key="player_{}_add".format(i + 1)), Sg.Radio("", group_id="player_{}".format(i + 1), key="player_{}_subtract".format(i + 1)), Sg.Radio("", default=True, group_id="player_{}".format(i + 1), key="player_{}_other".format(i + 1)), Sg.Input(key="player_{}_input".format(i + 1), size=(6, 1)) ]) scorer_layout.extend([[ Sg.Text("Save to File:"), Sg.Input(key="filename", size=(18, 1)), Sg.FileSaveAs(file_types=(("Text Document", "*.txt"), ("all files", "*.*"))) ], [Sg.Check("Keep client window on top", key="keep_on_top")], [ Sg.Button("Update", key="update", bind_return_key=True), Sg.Button("Start Client", key="client_start"), Sg.Button("Save To File", key="save_to_file") ]]) scorer_window = Sg.Window("Jeopardy Score Host", scorer_layout, resizable=True, finalize=True) client_window, client_event, client_values = None, None, None scores = { "players": players, "scores": ["0" for _ in range(len(players))], "previous_scores": ["0" for _ in range(len(players))] } question_value = 0 board = json.loads(open("board.json").read()) while True: scorer_event, scorer_values = scorer_window.read(100) if scorer_event is None: return elif scorer_event == "client_start" and not client_window: scorer_window["client_start"].update(disabled=True) scorer_window["keep_on_top"].update(disabled=True) client_window = make_client_window(scores, scorer_values["keep_on_top"]) elif scorer_event == "update": scores["previous_scores"] = scores["scores"][:] for i in range(len(scores["scores"])): if scorer_values["player_" + str(i + 1) + "_add"]: scores["scores"][i] = str( int(scores["scores"][i]) + question_value) elif scorer_values["player_" + str(i + 1) + "_subtract"]: scores["scores"][i] = str( int(scores["scores"][i]) - question_value) else: add_to_score = scorer_values["player_" + str(i + 1) + "_input"] if add_to_score.isnumeric() or ( len(add_to_score) > 1 and add_to_score[0] == "-" and add_to_score[1:].isnumeric()): scores["scores"][i] = str( int(scores["scores"][i]) + int(add_to_score)) scorer_window["player_" + str(i + 1) + "_add"](False) scorer_window["player_" + str(i + 1) + "_subtract"](False) scorer_window["player_" + str(i + 1) + "_other"](True) scorer_window["player_" + str(i + 1) + "_input"]("") if client_window is not None: table_data = [] for i in range(len(players)): row = [ players[i], scores["scores"][i], scores["previous_scores"][i] ] table_data.append(row) client_window["score_table"].update(values=table_data) elif scorer_event == "save_to_file": if scorer_values["filename"] != "": open(scorer_values["filename"], "w").write(str(scores)) current_question = open("SlideNotes.txt").read().strip("\n") scorer_window["current_question"](current_question) question_value = board[current_question] scorer_window["question_value"](str(question_value)) if current_question == "DD": for i in range(len(scores["players"])): scorer_window["player_" + str(i + 1) + "_add"].update(disabled=True) scorer_window["player_" + str(i + 1) + "_subtract"].update(disabled=True) else: for i in range(len(scores["players"])): scorer_window["player_" + str(i + 1) + "_add"].update(disabled=False) scorer_window["player_" + str(i + 1) + "_subtract"].update(disabled=False)
def questionnaireUi(): houseLay = [[ sg.T('家庭成员:'), sg.InputCombo(['1', '2', '3', '4', '5', '6+'], '1'), sg.T('(人)') ], [sg.Check('冬季是否用暖气取暖?')], [sg.T('居住面积:'), sg.I('10', (5, None)), sg.T('(平方米)')], [sg.T('每月用电:'), sg.I('50', (5, None)), sg.T('(度/月)')], [sg.T('每月用气:'), sg.I('10', (5, None)), sg.T('(立方米/月)')], [sg.T('每月用水:'), sg.I('10', (5, None)), sg.T('(吨/月)')], [sg.Button('下一步')]] trafficLay = [[sg.T('飞机:'), sg.I('0', (5, None)), sg.T('(千米/年)')], [sg.T('火车:'), sg.I('500', (5, None)), sg.T('(千米/年)')], [sg.T('公交:'), sg.I('10', (5, None)), sg.T('(千米/天)')], [sg.T('地铁:'), sg.I('10', (5, None)), sg.T('(站/天)')], [sg.T('小车:'), sg.I('0', (5, None)), sg.T('(千米/天)')], [sg.T('电梯:'), sg.I('10', (5, None)), sg.T('(层/天)')], [sg.Button('下一步')]] lifeLay = [[sg.T('每周消耗塑料袋子:'), sg.I('10', (5, None)), sg.T('(个/周)')], [sg.T('每周用一次性筷子:'), sg.I('10', (5, None)), sg.T('(双/周)')], [sg.T('每半年新购买衣服:'), sg.I('4', (5, None)), sg.T('(件/半年)')], [sg.T('每天摄取的主食量:'), sg.I('2', (5, None)), sg.T('(碗/天)')], [sg.T('每天摄取的肉食量:'), sg.I('1', (5, None)), sg.T('(盘/天)')], [sg.T('上班使用电脑时间:'), sg.I('4', (5, None)), sg.T('(小时/天)')], [sg.T('每天收发电子邮件:'), sg.I('2', (5, None)), sg.T('(封/天)')], [sg.T('每天使用搜索次数:'), sg.I('10', (5, None)), sg.T('(次/天)')], [sg.T('每月买书籍或杂志:'), sg.I('2', (5, None)), sg.T('(册/月)')], [sg.T('平均每月打印纸张:'), sg.I('20', (5, None)), sg.T('(张/月)')], [sg.Button('下一步')]] habitLay = [[sg.T('自行车代步:'), sg.I('0', (5, None)), sg.T('(千米/天)')], [sg.Check('节能灯泡 (在同等亮度下,节能灯比钨丝灯节能20%)')], [sg.Check('我习惯随手关灯')], [sg.Check('我不使电器处于待机状态')], [sg.Check('我习惯淋浴而非盆浴')], [sg.Check('我循环使用至少30%的家庭废旧物品')], [sg.Check('太阳能热水器')], [sg.OK('计算')]] houseWin = sg.Window('住宅', houseLay) houseEvent, houseVal = houseWin.Read() if houseEvent == '下一步': houseWin.Close() trafficWin = sg.Window('交通', trafficLay) trafficEvent, trafficVal = trafficWin.Read() if trafficEvent == '下一步': trafficWin.Close() lifeWin = sg.Window('生活', lifeLay) lifeEvent, lifeVal = lifeWin.Read() if lifeEvent == '下一步': lifeWin.Close() habitWin = sg.Window('习惯', habitLay) habitEvent, habitVal = habitWin.Read() if habitEvent in (None, '计算'): habitWin.Close() return houseVal.values(), trafficVal.values(), lifeVal.values( ), habitVal.values()
def the_gui(): sg.theme('Default1') textWidth = 23 inputWidth = 6 window, settings = None, load_settings(SETTINGS_FILE, DEFAULT_SETTINGS) layout = [ [ sg.Text('Number of Trials', size=(textWidth, 1)), sg.Input(100, size=(inputWidth, 1), key='-NumTrials-') ], [ sg.Text('Sample Rate (Hz)', size=(textWidth, 1)), sg.Input(default_text=20000, size=(inputWidth, 1), key='-SampleRate-'), sg.Check('Downsample?', default=True, key='-DownSample-') ], [ sg.Text('Trial Duration (s)', size=(textWidth, 1)), sg.Input(default_text=7, size=(inputWidth, 1), key='-TrialDuration-') ], [ sg.Text('False Alarm Timeout (s)', size=(textWidth, 1)), sg.Input(default_text=3, size=(inputWidth, 1), key='-FalseAlarmTimeout-') ], [ sg.Check('Play Tone?', default=True, key='-PlayTone-'), sg.Check('Enable punish?', default=False, key='-EnablePunish-') ], [ sg.Text('Time to Tone/Reward Window (from full force; s)', size=(textWidth, 1)), sg.Input(default_text=3, size=(inputWidth, 1), key='-TimeToTone-'), sg.Check('Vary this?', key='-VaryTone-') ], [ sg.Check('Abort if lick detected between start of trial and tone?', key='-AbortEarlyLick-') ], [ sg.Text('Reward Window Duration (s)', size=(textWidth, 1)), sg.Input(default_text=1, size=(inputWidth, 1), key='-RewardWindowDuration-'), sg.Check('Reward All Go Trials?', key='-RewardAllGos-') ], [ sg.Text('Go Probability', size=(textWidth, 1)), sg.Input(default_text=0.5, size=(inputWidth, 1), key='-GoProbability-'), sg.Check('Alternate trials?', key='-Alternate-') ], [ sg.Text('Force (mN)', size=(textWidth, 1)), sg.Input(default_text=50, size=(inputWidth, 1), key='-Force-'), sg.Check('Vary force?', key='-VaryForce-') ], [ sg.Text('Force Ramp Time (s)', size=(textWidth, 1)), sg.Input(default_text=1, size=(inputWidth, 1), key='-ForceRampTime-') ], [ sg.Text('Step Duration (s)', size=(textWidth, 1)), sg.Input(default_text=3, size=(inputWidth, 1), key='-StepDuration-'), sg.Check('Continue to Nogo?', key='-EnableContinuous-') ], [ sg.Text('Save Path', size=(textWidth, 1)), sg.Input(os.path.normpath('E://DATA/Behavior/'), size=(20, 1), key='-SavePath-'), sg.Check('Save?', default=True, key='-Save-') ], [ sg.Text('Animal ID', size=(textWidth, 1)), sg.Input(size=(20, 1), key='-Animal-') ], [ sg.Button('Run Task', size=(30, 2)), sg.Button('Dispense Reward', size=(30, 2)) ], [ sg.Button('Update Parameters'), sg.Button('Exit'), sg.Button('Setup DAQ'), sg.Input(key='Load Parameters', visible=False, enable_events=True), sg.FileBrowse( 'Load Parameters', initial_folder='Z:\\HarveyLab\\Tier1\\Alan\\Behavior'), sg.Button('Test Lick Monitor') ], [sg.Output(size=(70, 20), key='-OUTPUT-')] ] window = sg.Window('Sustained Detection Task', layout) event, values = window.read(10) taskParameters = updateParameters(values) while True: event, values = window.read() print(event) if event in (sg.WIN_CLOSED, 'Exit'): break if event == 'Update Parameters': taskParameters = updateParameters(values) print('parameters updated') if event == 'Setup DAQ': event, values = create_settings_window(settings).read(close=True) if event == 'Save': save_settings(SETTINGS_FILE, settings, values) if event == 'Run Task': taskParameters = updateParameters(values) print('parameters updated') try: if daqStatus != 'task': do_task.close() ai_task, di_task, ao_task, do_task, daqStatus = setupDaq( settings, taskParameters) except NameError: ai_task, di_task, ao_task, do_task, daqStatus = setupDaq( settings, taskParameters) threading.Thread(target=runTask, args=(ai_task, di_task, ao_task, do_task, taskParameters), daemon=True).start() if event == 'Dispense Reward': try: if daqStatus != 'dispenseReward': ai_task.close() di_task.close() ao_task.close() do_task.close() do_task, daqStatus = setupDaq(settings, taskParameters, 'dispenseReward') except NameError: do_task, daqStatus = setupDaq(settings, taskParameters, 'dispenseReward') dispense(do_task, taskParameters) if event == 'Load Parameters': print(f'Updating parameters from {values["Load Parameters"]}') try: tempParameters = pickle.load( values['Load Parameters'])['taskParameters'] window.Element('-NumTrials-').Update( value=tempParameters['numTrials']) window.Element('-SampleRate-').Update( value=tempParameters['Fs']) window.Element('-DownSample-').Update( value=tempParameters['downSample']) window.Element('-TrialDuration-').Update( value=tempParameters['trialDuration']) window.Element('-FalseAlarmTimeout-').Update( value=tempParameters['falseAlarmTimeout']) if 'playTone' in tempParameters.keys(): window.Element('-PlayTone-').Update( value=tempParameters['playTone']) else: window.Element('-PlayTone-').Update(value=True) window.Element('-TimeToTone-').Update( value=tempParameters['timeToTone']) window.Element('-VaryTone-').Update( value=tempParameters['varyTone']) if 'abortEarlyLick' in tempParameters.keys(): window.Element('-AbortEarlyLick-').Update( value=tempParameters['abortEarlyLick']) else: window.Element('-AbortEarlyLick-').Update(value=False) window.Element('-RewardWindowDuration-').Update( value=tempParameters['rewardWindowDuration']) window.Element('-RewardAllGos-').Update( value=tempParameters['rewardAllGos']) window.Element('-GoProbability-').Update( value=tempParameters['goProbability']) window.Element('-Alternate-').Update( value=tempParameters['alternate']) if 'varyForce' in tempParameters.keys(): window.Element('-VaryForce-').Update( value=tempParameters['varyForce']) else: window.Element('-VaryForce-').Update(value=False) window.Element('-Force-').Update(value=tempParameters['force']) window.Element('-ForceRampTime-').Update( value=tempParameters['forceTime']) window.Element('-StepDuration-').Update( value=tempParameters['forceDuration']) window.Element('-EnableContinuous-').Update( value=tempParameters['forceContinuous']) except: 'invalid file' window.close()
def main(): layout = [ [ # TODO output only stores one line, have it write like stdout sg.Output( size=(90, 25), echo_stdout_stderr=True, tooltip="Results of the dice rolled", key="-OUTPUT-", ) ], [ # TODO find way to make to auto-clear this field when clicked on sg.Input(20, size=(8, 1), tooltip="Amount of sides on the dice", key="-SIDES-"), # TODO disable if 'repeat' chosen and vice versa sg.Input( 1, size=(8, 1), tooltip= "Times to roll the dice. Disabled if Repeat button enabled", key="-COUNT-", ), # TODO these need to be able to be unchecked # but remain in radio group to be one or the other sg.Radio( "Adv.", "adv_or_disadv", tooltip="Roll two d20 and choose the higher roll", ), sg.Radio( "Disadv.", "adv_or_disadv", tooltip="Roll two d20 and choose the lower roll", ), sg.Check( "Sum rolls", auto_size_text=True, tooltip="Sum all rolls. Only valid with 'Count'", ), sg.Submit( "Roll!", auto_size_button=True, tooltip="Roll the dice with the parameters given", ), ], ] window = sg.Window( "Dice", layout, auto_size_text=True, auto_size_buttons=True, size=(600, 400), element_justification="center", ) while True: event, values = window.read() if event in (sg.WINDOW_CLOSED, "Exit"): break if event == "Roll!": sides = int(values["-SIDES-"]) count = int(values["-COUNT-"]) window["-OUTPUT-"].update(roll_dice(sides, count)) window.Refresh() window.close()
def make_window_test_model_params(models_list): """ Creates window layout for performing testing of the model :param models_list: list of all created models' names :type models_list: list[str] :return: window with functionality of setting parameters for testing the model :rtype: PySimpleGUI.PySimpleGUI.Window """ layout = [ [ sg.Button("Back", enable_events=True, key="-BACK-") ], [ sg.T(' ' * 21), sg.Text("Model") ], [ sg.DropDown(models_list, tooltip="Select model to test", size=(35, 10), enable_events=True, key="-MODEL-") ], [ sg.T(' ') ], [ sg.T(' ' * 3), sg.Text("Distribution of test and train sets"), ], [ sg.Slider(range=(1, 100), orientation='h', size=(30, 10), default_value=25, enable_events=True, key="-TEST SIZE-") ], [ sg.Text("Test set size:"), sg.Text("000", enable_events=True, key="-TEST-"), sg.Text("Training set size:"), sg.Text("000", enable_events=True, key="-TRAINING-"), ], [ sg.T(' ') ], [ sg.Text("Measures of quality") ], [ sg.Check("Coefficient of determination", default=True, key="-R SQUARE-"), ], [ sg.Check("Mean error of point's position", default=True, key="-MEAN ERROR-"), ], [ sg.Check("Explained variance", default=True, key="-EXPLAINED VARIANCE-"), ], [ sg.T(' ') ], [ sg.T(' ' * 20), sg.Button("Test model", enable_events=True, key="-SUBMIT BUTTON-") ], ] return sg.Window("Test params", layout, finalize=True)
import PySimpleGUI as sg import TextFileMergerFnFile sg.theme('BluePurple') layout = [ [sg.Text('Folder of text files:*')], [sg.InputText('',key='input_folderpath',size=(80,1),disabled=True,enable_events=True), sg.FolderBrowse('Browse',key='fb_infilefolder',enable_events=True)], [sg.Text('Output File path:')], [sg.InputText('',key='output_folderpath',size=(80,1),disabled=True,enable_events=True), sg.FolderBrowse('Browse',key='fb_outfilefolder')], [sg.Check('Remove empty lines from the output file**',key='_CHK_EMTYLINE_REMOVE_',default=False)], [sg.Text('Output Text FileName (No extension please!!) : '),sg.InputText('',size=(45,1),key='output_filename',enable_events = True)], [sg.Text('Status :',key='resultLabel',size=(6,1),justification='Left',text_color='Green'), sg.InputText('',key='resultbox',disabled=True,size=(30,1),text_color='Green')], [sg.Button('Submit',key='btn_submit',disabled=True),sg.Button('Reset',key='btn_reset'), sg.Button('Exit',key='btn_exit')], [sg.Text('How to use the tool:',text_color='Red')], [sg.Text('1. Place all text files(.txt) to be merged in a folder\n' '2. Browse the folder as "Folder of text files" \n' '3. Browse output file folder as "Output File path"\n' ' This is optional. In case output folder is not provided, Output file will be placed at same location as Application\n' '4. **Checking this option will remove all empty lines from the file**\n' '5. Default output file name would be - Output_MergedFile.txt\n' '6. Click Submit button to merge files\n',text_color='Red')]] window = sg.Window('Text File Merger',layout) while True: event, values = window.read() if event in (None, 'Exit', 'btn_exit'): # if user closes window or clicks Exit break
def addition_popup(md: MemoData) -> bool: result = False pass_pin_col_lay = [ [sg.Txt(**pass_txt), sg.In(**pass_in)], [sg.Check(**pass_check)], ] pass_pin_elem = sg.Col(pass_pin_col_lay, **pass_pin_col) used_err_col_lay = [ [sg.Txt(**used_err_txt)], ] used_err_pin_elem = sg.Col(used_err_col_lay, **used_err_col) empty_err_col_lay = [ [sg.Txt(**empty_err_txt)], ] empty_err_pin_elem = sg.Col(empty_err_col_lay, **empty_err_col) w = sg.Window( title="add memo", layout=[ [sg.Txt("title:"), sg.In(**title_in)], [sg.Txt("lock:"), sg.Btn(**on_btn), sg.Btn(**off_btn)], [sg.pin(pass_pin_elem)], [sg.pin(used_err_pin_elem)], [sg.pin(empty_err_pin_elem)], [sg.Cancel(**cancel_btn), sg.OK(**ok_btn)], ], size=(255, 180), keep_on_top=True, disable_close=True, modal=True, ) switch = SwitchButtons(w) while True: e, v = cast(tuple[addition, dict[addition, str]], w()) if e in (sg.WIN_CLOSED, addition.cancel_btn): break lock = switch(e) w[addition.pass_col].update(visible=lock) char = "" if w[addition.pass_check].get() else "*" w[addition.pass_in].update(password_char=char) if e == addition.ok_btn: if verify_title_is_valid(w, md, v): md.memos.append(datas_to_memo(v, lock)) result = True break w.close() return result
key='-TXT_DATE_IN-', format='%Y:%m:%d') ], [ sg.Input(size=(9, 1), key='-DATE_OUT-', readonly=True), sg.CalendarButton('Конец', begin_at_sunday_plus=1, key='-TXT_DATE_OUT-', format='%Y:%m:%d') ], [sg.Text('4) Выбрать тип занятости')], [ sg.Combo(['Ставка:', 'Оклад:', 'Выход:', 'За час:'], ['Ставка:'], size=(7, 1), readonly=True), sg.Input('0.00', size=(9, 1), key='-TYPE-', justification='r'), sg.Check('Автосогласование доп. работ') ], [sg.Text('3) Выбрать файл для загрузки')]] # layout = [[sg.Text('Your typed chars appear here:'), sg.Text(size=(15,1), key='-OUTPUT-')], # [sg.Input(key='-IN-')], # [sg.Button('Show'), sg.Button('Exit')]] # window = sg.Window('Массовое назначение мерчей', layout) while True: # Event Loop event, values = window.read() print(event, values) # if event == '-DATE_IN-': # window['-TXT_DATE_IN-'].update(values['-DATE_IN-']) # if event == '-DATE_OUT-': # window['-TXT_DATE_OUT-'].update(values['-DATE_OUT-'])
##################### Open and run panel ##################### sg.theme('Default1') textWidth = 23 inputWidth = 6 window, settings = None, load_settings(SETTINGS_FILE, DEFAULT_SETTINGS) layout = [ [ sg.Text('Number of Trials', size=(textWidth, 1)), sg.Input(100, size=(inputWidth, 1), key='-NumTrials-') ], [ sg.Text('Sample Rate (Hz)', size=(textWidth, 1)), sg.Input(default_text=20000, size=(inputWidth, 1), key='-SampleRate-'), sg.Check('Downsample?', default=True, key='-DownSample-') ], [ sg.Text('Trial Duration (s)', size=(textWidth, 1)), sg.Input(default_text=7, size=(inputWidth, 1), key='-TrialDuration-') ], [ sg.Text('False Alarm Timeout (s)', size=(textWidth, 1)), sg.Input(default_text=3, size=(inputWidth, 1), key='-FalseAlarmTimeout-') ], [sg.Check('Play Tone?', default=True, key='-PlayTone-')], [sg.Check('Optical Only?', default=True, key='-Optical-')], [ sg.Text('Time to Tone/Reward Window (from full force; s)', size=(textWidth, 1)),
def boolWidget(valtype, val, key, disabled=False, size=(None,None)): if val is None: val = False return [ sg.Check('', default=val, key=key, change_submits=True, disabled=disabled), ]
def __init__(self) -> None: self.ns = 'Trem_' self.sus_bt = sg.Button('sus region', key=self.ns + 'sus') self.sus_marker = sg.Check('marker on hard attack', default=True, key=self.ns + 'sus_marker') self.sus_want_cut = sg.Check( 'want cut', default=True, key=self.ns + 'sus_want_cut', tooltip='if checked — part left to the sus will be erased') self.rel_bt = sg.Button('cut release', key=self.ns + 'release_cut') self.rel_reg_bt = sg.Button('release region', key=self.ns + 'release_region') self.release_region_want_cut = sg.Check('want cut', default=True, key=self.ns + 'release_region_want_cut') self.dyn = sg.Combo( values=['ff', 'f', 'p', 'pp'], default_value='ff', key=self.ns + 'dyn', ) self.sul = sg.Combo( values=['sulTop', 'SulBot'], default_value='sulBot', key=self.ns + 'sul', ) silence_def = .1 self.sus_silense_sl = sg.Slider( range=(-60, 0), resolution=.001, key=self.ns + 'sus_silence_treshold', tooltip='threshold in dB to count as sustain silence', # enable_events=True, default_value=silence_def, orientation='h', size=(30, 10)) self.silense_sl = sg.Slider( range=(-60, 0), resolution=.001, key=self.ns + 'silence_treshold', tooltip='threshold in dB to count as silence', # enable_events=True, default_value=silence_def, orientation='h', size=(30, 10)) self.rel_fade_out = widgets.FadeRegions(self.ns, 'release') self.name = 'Trem' self.layout = [[ self.sus_bt, sg.Column([[self.sus_want_cut], [self.sus_marker]]), self.dyn, self.sul, self.rel_bt, sg.Column([[self.rel_reg_bt], [self.release_region_want_cut]]), ], [ sg.Column([[self.sus_silense_sl], [self.silense_sl]]), self.rel_fade_out.layout, ]]