def get(self, default_input=""): """Get input from user. Notes ----- This displays and updates the input box automatically. Pressing ENTER returns the user input. Pressing ESC quits, returning an empty string. Parameters ---------- default_input : str, optional default input in the textbox See Also -------- design.experiment.register_wait_callback_function """ if android_show_keyboard is not None: android_show_keyboard() self._user = [] for char in default_input: self._user.append(char) self._create() self._update() if self._character_filter is None: filter = list(range(0, 256)) + constants.K_ALL_KEYPAD_DIGITS else: filter = self._character_filter while True: inkey, string = self._get_key() if inkey == pygame.K_BACKSPACE: self._user = self._user[0:-1] elif inkey == pygame.K_RETURN or inkey == pygame.K_KP_ENTER: break elif inkey != pygame.K_LCTRL or inkey != pygame.K_RCTRL: if not self._user_text_surface_size[0] >= self._max_size[0]: if android is not None: if inkey in filter: if inkey in constants.K_ALL_KEYPAD_DIGITS: inkey = numpad_digit_code2ascii(inkey) self._user.append(chr(inkey)) else: if inkey in constants.K_ALL_KEYPAD_DIGITS: self._user.append( chr(numpad_digit_code2ascii(inkey))) elif string and ord(string) in filter: self._user.append(string) self._update() got = "".join(self._user) if self._logging: _internals.active_exp._event_file_log( "TextInput,entered,{0}".format(unicode2byte(got))) if android_hide_keyboard is not None: android_hide_keyboard() return got
def get(self, default_input=""): """Get input from user. Notes ----- This displays and updates the input box automatically. Pressing ENTER returns the user input. Pressing ESC quits, returning an empty string. Parameters ---------- default_input : str, optional default input in the textbox See Also -------- design.experiment.register_wait_callback_function """ if android_show_keyboard is not None: android_show_keyboard() self._user = [] for char in default_input: self._user.append(char) self._create() self._update() if self._ascii_filter is None: ascii_filter = range(0, 256) + constants.K_ALL_KEYPAD_DIGITS else: ascii_filter = self._ascii_filter while True: inkey, string = self._get_key() if inkey == pygame.K_BACKSPACE: self._user = self._user[0:-1] elif inkey == pygame.K_RETURN or inkey == pygame.K_KP_ENTER: break elif inkey != pygame.K_LCTRL or inkey != pygame.K_RCTRL: if not self._user_text_surface_size[0] >= self._max_size[0]: if android is not None: if inkey in ascii_filter: if inkey in constants.K_ALL_KEYPAD_DIGITS: inkey = numpad_digit_code2ascii(inkey) self._user.append(chr(inkey)) else: if inkey in constants.K_ALL_KEYPAD_DIGITS: self._user.append(chr(numpad_digit_code2ascii(inkey))) elif string and ord(string) in ascii_filter: self._user.append(string) self._update() got = "".join(self._user) if self._logging: expyriment._active_exp._event_file_log("TextInput,entered,{0}".format(unicode2str(got))) if android_hide_keyboard is not None: android_hide_keyboard() return got
def get(self, default_input="", process_control_events=True): """Get input from user. Notes ----- This displays and updates the input box automatically. Pressing ENTER returns the user input. Parameters ---------- default_input : str, optional default input in the textbox process_control_events : bool, optional process ``io.Keyboard.process_control_keys()`` and ``io.Mouse.process_quit_event()`` (default = True) Returns ------- text_input: str or None returns the entered text string. If get() is interrupted by a CallbackQuitEvent from a registered wait-callback-function get() returns None. See Also -------- expyriment.design.Experiment.register_wait_callback_function """ if android_show_keyboard is not None: android_show_keyboard() self._user = [] for char in default_input: self._user.append(char) self._create() self._update() if self._character_filter is None: filter = list(range(0, 256)) + constants.K_ALL_KEYPAD_DIGITS else: filter = self._character_filter while True: inkey, string = self._get_key(process_control_events) if isinstance(inkey, CallbackQuitEvent): return None elif inkey == pygame.K_BACKSPACE: self._user = self._user[0:-1] elif inkey == pygame.K_RETURN or inkey == pygame.K_KP_ENTER: break elif inkey not in (pygame.K_LCTRL, pygame.K_RCTRL, pygame.K_TAB): if not self._user_text_surface_size[0] >= self._max_size[0]: if android is not None: if inkey in filter: if inkey in constants.K_ALL_KEYPAD_DIGITS: inkey = numpad_digit_code2ascii(inkey) self._user.append(chr(inkey)) else: if inkey in constants.K_ALL_KEYPAD_DIGITS: self._user.append( chr(numpad_digit_code2ascii(inkey))) elif string and ord(string) in filter: self._user.append(string) self._update() got = "".join(self._user) if self._logging: _internals.active_exp._event_file_log( "TextInput,entered,{0}".format(got)) if android_hide_keyboard is not None: android_hide_keyboard() return got
def wait(self, keys=None, duration=None, wait_for_keyup=False, check_for_control_keys=True): """Wait for keypress(es) (optionally for a certain amount of time). This function will wait for a keypress and returns the found key as well as the reaction time. (This function clears the event queue!) Parameters ---------- keys : int or list, optional a specific key or list of keys to wait for duration : int, optional maximal time to wait in ms wait_for_keyup : bool, optional if True it waits for key-up check_for_control_keys : bool, optional checks if control key has been pressed (default=True) Returns ------- found : char pressed character rt : int reaction time in ms Notes ----- Keys are defined my keyboard constants (please use see misc.constants) See Also -------- design.experiment.register_wait_callback_function """ if expyriment.control.defaults._skip_wait_functions: return None, None if android_show_keyboard is not None: android_show_keyboard() start = get_time() rt = None found_key = None self.clear() if keys is None: keys = self.default_keys else: try: keys = list(keys) except: keys = [keys] if wait_for_keyup: target_event = pygame.KEYUP else: target_event = pygame.KEYDOWN pygame.event.pump() done = False while not done: rtn_callback = expyriment._active_exp._execute_wait_callback() if isinstance(rtn_callback, expyriment.control.CallbackQuitEvent): done = True found_key = rtn_callback rt = int((get_time() - start) * 1000) for event in pygame.event.get([pygame.KEYDOWN, pygame.KEYUP]): if check_for_control_keys and Keyboard.process_control_keys(event): done = True elif event.type == target_event: if keys is not None: if event.key in keys: rt = int((get_time() - start) * 1000) found_key = event.key done = True else: rt = int((get_time() - start) * 1000) found_key = event.key done = True if duration and not done: done = int((get_time() - start) * 1000) >= duration time.sleep(0.0005) if self._logging: expyriment._active_exp._event_file_log("Keyboard,received,{0},wait"\ .format(found_key)) if android_hide_keyboard is not None: android_hide_keyboard() return found_key, rt
def wait(self, keys=None, duration=None, wait_for_keyup=False, callback_function=None, process_control_events=True): """Wait for keypress(es) (optionally for a certain amount of time). This function will wait for a keypress and returns the found key as well as the reaction time. (This function clears the event queue!) Parameters ---------- keys : int or list, optional a specific key or list of keys to wait for duration : int, optional maximal time to wait in ms wait_for_keyup : bool, optional if True it waits for key-up callback_function : function, optional function to repeatedly execute during waiting loop process_control_events : bool, optional process ``io.Keyboard.process_control_keys()`` and ``io.Mouse.process_quit_event()`` (default = True) Returns ------- found : char pressed character rt : int reaction time in ms Notes ----- Keys are defined by keyboard constants (please use see misc.constants) See Also -------- design.experiment.register_wait_callback_function """ if _internals.skip_wait_methods: return None, None if android_show_keyboard is not None: android_show_keyboard() start = get_time() rt = None found_key = None self.clear() if keys is None: keys = self.default_keys else: try: keys = list(keys) except: keys = [keys] if wait_for_keyup: target_event = pygame.KEYUP else: target_event = pygame.KEYDOWN pygame.event.pump() done = False while not done: if isinstance(callback_function, FunctionType): rtn_callback = callback_function() if isinstance(rtn_callback, _internals.CallbackQuitEvent): done = True found_key = rtn_callback rt = int((get_time() - start) * 1000) if _internals.active_exp.is_initialized: rtn_callback = _internals.active_exp._execute_wait_callback() if isinstance(rtn_callback, _internals.CallbackQuitEvent): done = True found_key = rtn_callback rt = int((get_time() - start) * 1000) if process_control_events: _internals.active_exp.mouse.process_quit_event() for event in pygame.event.get([pygame.KEYDOWN, pygame.KEYUP]): if _internals.active_exp.is_initialized and \ process_control_events and \ Keyboard.process_control_keys(event): done = True elif event.type == target_event: if keys is not None: if event.key in keys: rt = int((get_time() - start) * 1000) found_key = event.key done = True else: rt = int((get_time() - start) * 1000) found_key = event.key done = True if duration and not done: done = int((get_time() - start) * 1000) >= duration time.sleep(0.0005) if self._logging: _internals.active_exp._event_file_log("Keyboard,received,{0},wait"\ .format(found_key)) if android_hide_keyboard is not None: android_hide_keyboard() return found_key, rt
def wait(self, keys=None, duration=None, wait_for_keyup=False, check_for_control_keys=True): """Wait for keypress(es) (optionally for a certain amount of time). This function will wait for a keypress and returns the found key as well as the reaction time. (This function clears the event queue!) Parameters ---------- keys : int or list, optional a specific key or list of keys to wait for duration : int, optional maximal time to wait in ms wait_for_keyup : bool, optional if True it waits for key-up check_for_control_keys : bool, optional checks if control key has been pressed (default=True) Returns ------- found : char pressed charater rt : int reaction time in ms """ if android_show_keyboard is not None: android_show_keyboard() start = get_time() rt = None found_key = None self.clear() if keys is None: keys = self.default_keys if keys is not None and type(keys) is not list: keys = [keys] if wait_for_keyup: target_event = pygame.KEYUP else: target_event = pygame.KEYDOWN pygame.event.pump() done = False while not done: expyriment._active_exp._execute_wait_callback() for event in pygame.event.get(): if check_for_control_keys and Keyboard.process_control_keys(event): done = True elif event.type == target_event: if keys is not None: if event.key in keys: rt = int((get_time() - start) * 1000) found_key = event.key done = True else: rt = int((get_time() - start) * 1000) found_key = event.key done = True if duration and not done: done = int((get_time() - start) * 1000) >= duration time.sleep(0.0005) if self._logging: expyriment._active_exp._event_file_log("Keyboard,received,{0},wait"\ .format(found_key)) if android_hide_keyboard is not None: android_hide_keyboard() return found_key, rt