from typing import Iterator, Tuple DISPLAY_WIDTH = 240 DISPLAY_HEIGHT = 240 def grid(dim: int, grid_cells: int, cell: int) -> int: step = dim // grid_cells ofs = step // 2 return cell * step + ofs LEFT = grid(DISPLAY_WIDTH, 3, 0) MID = grid(DISPLAY_WIDTH, 3, 1) RIGHT = grid(DISPLAY_WIDTH, 3, 2) TOP = grid(DISPLAY_HEIGHT, 4, 0) BOTTOM = grid(DISPLAY_HEIGHT, 4, 3) OK = (RIGHT, BOTTOM) CANCEL = (LEFT, BOTTOM) INFO = (MID, BOTTOM) CONFIRM_WORD = (MID, TOP) RESET_MINUS = (LEFT, grid(DISPLAY_HEIGHT, 5, 1)) RESET_PLUS = (RIGHT, grid(DISPLAY_HEIGHT, 5, 1)) RESET_WORD_CHECK = [ (MID, grid(DISPLAY_HEIGHT, 6, 3)), (MID, grid(DISPLAY_HEIGHT, 6, 4)), (MID, grid(DISPLAY_HEIGHT, 6, 5)), ] BUTTON_LETTERS = ("ab", "cd", "ef", "ghij", "klm", "nopq", "rs", "tuv", "wxyz") def grid35(x: int, y: int) -> Tuple[int, int]: return grid(DISPLAY_WIDTH, 3, x), grid(DISPLAY_HEIGHT, 5, y) def grid34(x: int, y: int) -> Tuple[int, int]: return grid(DISPLAY_WIDTH, 3, x), grid(DISPLAY_HEIGHT, 4, y) def type_word(word: str) -> Iterator[Tuple[int, int]]: for l in word: idx = next(i for i, letters in enumerate(BUTTON_LETTERS) if l in letters) grid_x = idx % 3 grid_y = idx // 3 + 1 # first line is empty yield grid34(grid_x, grid_y)