def move(self): # Determine head coords head = self.coords[-1][:] # Calc new head coords if self.direction == curses.KEY_UP: head[0]-=1 elif self.direction == curses.KEY_DOWN: head[0]+=1 elif self.direction == curses.KEY_RIGHT: head[1]+=1 elif self.direction == curses.KEY_LEFT: head[1]-=1 # Check field limit head = self._check_limit(head) del(self.coords[0]) self.coords.append(head) self.field.snake_coords = self.coords if not self.is_alive(): sys.exit() # check if snake eat an entity if self.field.is_snake_eat_entity(): curses.beep() self.level_up() self.field.add_entity()
def get_and_use_mouse_event(self): mouse_event = curses.getmouse() wg = self.find_mouse_handler(mouse_event) if wg: self.set_editing(wg) else: curses.beep()
def _beep(self): if not self.active: return try: curses.beep() except curses.error: pass
def down(self, lines=1): max_highlight = self.content_length() - 1 if self.highlight_line >= max_highlight: curses.beep() return self.highlight_line += lines
def h_set_filtered_to_selected(self, ch): # This is broken on multiline if len(self._filtered_values_cache) < 2: self.value = self._filtered_values_cache else: # There is an error - trying to select too many things. curses.beep()
def beep(): """ Does an audible beep sound Reference: http://de3.aminet.net/dev/src/clr.py.txt """ if sys.platform == 'linux2': for dev in ('/dev/audio', '/dev/oss', '/dev/dsp', '/dev/sound'): if os.path.exists(dev): try: audio = file(dev, 'wb') for i in xrange(250): audio.write(chr(32) * 4) audio.write(chr(0) * 4) audio.close() return except: pass try: import curses curses.initscr() curses.beep() curses.flash() curses.endwin() return except: dataToStdout('\a', True) else: dataToStdout('\a', True)
def get_selected_line(stdscr, lines): """Called by curses.wrapper, renders the interface and fetches the selected line.""" init(stdscr) state = ProgramState(stdscr, lines) while True: c = stdscr.getch() if c == ord("q") or c == ord("Q"): # Quit break elif c == curses.KEY_DOWN: try: state.scroll_down() except curses.error: curses.beep() state.refresh() elif c == curses.KEY_UP: try: state.scroll_up() except curses.error: curses.beep() state.refresh() elif c == ord("\n"): # Enter break cleanup(stdscr) print state.text[state.selected_line]
def countdown(self, scr, inspection = 15.0): scr.clear() maxqy, maxqx = scr.getmaxyx() ret = 0 start = time() c = -1 while c < 0 or c == curses.KEY_RESIZE: scr.clear() delta = inspection + start - time() if delta > 0: s = '%.2f' % delta elif delta > -2: s = '+2' ret = 2 else: s = 'DNF' ret = 'DNF' scr.addstr(maxqy//2 - 1, (maxqx - len(s))//2, s) scr.refresh() c = scr.getch() curses.napms(10) curses.beep() return ret
def process_key(code): """Process a key press. `code` is ncurses key code or a single unicode character.""" global default_handler if not is_key_unhandled((code,meta)): for i in (1, 2): for t in [t for t in keytables if t.active]: try: return t.process_key(code,meta) except (KeyBindingNotFoundError, FunctionNotFoundError): continue if code == curses.erasechar(): # workaround for bad terminfo code = curses.KEY_BACKSPACE else: break unhandled_keys[code,meta]=True if default_handler: return default_handler(code,meta) else: try: logging.getLogger("cjc.ui.keytable").debug("Unhandled key: "+keycode_to_name(code,meta)) curses.beep() except curses.error: pass return 0
def file_func(): # file menu for exiting, exiting, etc. fMenu = curses.newwin(6,20,2,1) fMenu.box() fMenu.addstr(1,2, "W", hotkey_attr) fMenu.addstr(1,3, "rite Something", menu_attr) fMenu.addstr(2,2, "C", hotkey_attr) fMenu.addstr(2,3, "lear", menu_attr) fMenu.refresh() set_menu = True while set_menu == True: c = fMenu.getch() if c in (ord('W'), ord('w')): screen.addstr(10,10, "Well Hot Damn") screen.move(1,23) fMenu.erase() screen.refresh() set_menu = False elif c in (ord('C'), ord('c')): screen.addstr(10,10, " ") screen.move(1,23) fMenu.erase() screen.refresh() set_menu = False else: curses.beep() return CONTINUE
def on_groupchat_direct_invitation(self, message): """ Direct invitation received """ room = safeJID(message['groupchat_invite']['jid']) if room.bare in self.pending_invites: return inviter = message['from'] reason = message['groupchat_invite']['reason'] password = message['groupchat_invite']['password'] continue_ = message['groupchat_invite']['continue'] msg = "You are invited to the room %s by %s" % (room, inviter.full) if password: msg += ' (password: "******")' % password if continue_: msg += '\nto continue the discussion' if reason: msg += "\nreason: %s" % reason self.information(msg, 'Info') if 'invite' in config.get('beep_on').split(): curses.beep() self.pending_invites[room.bare] = inviter.full logger.log_roster_change(inviter.full, 'invited you to %s' % room.bare)
def exit_application(self): curses.beep() self.parentApp.setNextForm(None) self.editing = False self.parentApp.switchFormNow() if self.timer: self.timer.cancel()
def command(self, key): '''process commands''' if key == curses.KEY_UP and self.selected[0]: self.selected[0] -= 1 self.__changed = True elif key == curses.KEY_DOWN and self.selected[0] + 1 < self.dim[0]: self.selected[0] += 1 self.__changed = True elif key == curses.KEY_LEFT and self.selected[1]: self.selected[1] -= 1 self.__changed = True elif key == curses.KEY_RIGHT and self.selected[1] + 1 < self.dim[1]: self.selected[1] += 1 self.__changed = True elif key in (10,): curses.beep() if self.active != self.selected: self.active = self.selected[:] self.__changed = True if self.callback is not None: r, c = self.active self.callback({'active': self.__cells__[r][c]}) return self.__changed
def scrollUp(self): """Scrolls the window up one line""" if self.__firstShownLine > 0: self.__firstShownLine -= 1 self.__refreshContent() else: curses.beep()
def file_func(args): #s = curses.newwin(5,10,10,20) #s = screen.derwin(10, 10, 1, 2) s = curses.newwin(5,10,10,20) s.box() s.addstr(1,2, "I", hotkey_attr) s.addstr(1,3, "nput", menu_attr) s.addstr(2,2, "O", hotkey_attr) s.addstr(2,3, "utput", menu_attr) s.addstr(3,2, "T", hotkey_attr) s.addstr(3,3, "ype", menu_attr) s.addstr(1,2, "", hotkey_attr) s.refresh() c = s.getch() if c in (ord('I'), ord('i'), curses.KEY_ENTER, 10): curses.echo() s.erase() screen.addstr(5,33, " "*43, curses.A_UNDERLINE) cfg_dict['source'] = screen.getstr(5,33) curses.noecho() elif c in (ord('O'), ord('o')): curses.echo() s.erase() screen.addstr(8,33, " "*43, curses.A_UNDERLINE) cfg_dict['target'] = screen.getstr(8,33) curses.noecho() elif c in (ord('T'), ord('t')): s.addstr(3,7, "->", menu_attr) s.refresh() s2 = curses.newwin(8,15,4,10) s2.box() s2.addstr(1,2, "H", hotkey_attr) s2.addstr(1,3, "TML", menu_attr) s2.addstr(2,2, "P", hotkey_attr) s2.addstr(2,3, "ython", menu_attr) s2.addstr(3,2, "F", hotkey_attr) s2.addstr(3,3, "AQ", menu_attr) s2.addstr(4,2, "S", hotkey_attr) s2.addstr(4,3, "mart_ASCII", menu_attr) s2.addstr(5,2, "R", hotkey_attr) s2.addstr(5,3, "aw", menu_attr) s2.addstr(6,2, "I", hotkey_attr) s2.addstr(6,3, "nfer Type", menu_attr) s2.addstr(6,2, "", hotkey_attr) s2.refresh() c = s2.getch() if c in (ord('I'), ord('i'), curses.KEY_ENTER, 10): cfg_dict['type'] = 'INFER' elif c in (ord('H'), ord('h')): cfg_dict['type'] = 'HTML' elif c in (ord('P'), ord('p')): cfg_dict['type'] = 'PYTHON' elif c in (ord('F'), ord('f')): cfg_dict['type'] = 'FAQ' elif c in (ord('S'), ord('s')): cfg_dict['type'] = 'SMART_ASCII' elif c in (ord('R'), ord('r')): cfg_dict['type'] = 'RAW' else: curses.beep() s2.erase() s.erase() else: curses.beep() s.erase() return CONTINUE
def receiveKey(self, key): """Reacts to a key pressed. You should explicitly call this method only if you didn't call the object's getch().""" if key == curses.KEY_UP: if self.__selectedRow > 0: self.__printRow(self.__selectedRow) self.__selectedRow -= 1 if self.__selectedRow < self.__firstShownLine: self.scrollUp() else: self._window.attron(curses.A_BOLD) self.__printRow(self.__selectedRow) self._window.attroff(curses.A_BOLD) else: curses.beep() elif key == curses.KEY_DOWN: if self.__selectedRow < len(self.__data) - 1: self.__printRow(self.__selectedRow) self.__selectedRow += 1 if self.__selectedRow == \ self.__firstShownLine + self.height - 2: self.scrollDown() else: self._window.attron(curses.A_BOLD) self.__printRow(self.__selectedRow) self._window.attroff(curses.A_BOLD) else: curses.beep()
def run(self): """Run the editor main loop (read and execute command)""" try: screen = curses.initscr() curses.noecho() curses.raw() curses.meta(1) screen.keypad(1) height, width = screen.getmaxyx() self._width = width self._height = height self._window.set_size(width, height-1) self.redisplay(screen) while 1: cmd = self.read_command(screen) if cmd is None: curses.beep() self.message("No command on key '%s'" % self.last_key()) else: self.message(None) cmd.run() self.redisplay(screen) finally: screen.keypad(0) curses.meta(0) curses.noraw() curses.endwin()
def delete(self, incr): '''Delete characters. A negative number means delete to the left. A positive number means delete to the right ''' # consider these curses functions clrtoeol (delete to eol) # clrtobot (clear to bottom of window) # delch (delete char at y,x) # deleteln() if incr < 0: direction = -1 adj = -1 else: direction = 1 adj = 0 dprint('del a ' + str(self.txt[self.line_ptr].get_point())) # how many chars remain after the deletion is made: remaining_chars = len(self.txt[self.line_ptr]) - self.txt[self.line_ptr].get_point() if remaining_chars < 0: curses.beep() incr += remaining_chars self.txt[self.line_ptr].delete(self.txt[self.line_ptr].get_point() \ + incr, incr)# self.txt[self.line_ptr].get_point()) else: self.txt[self.line_ptr].delete(self.txt[self.line_ptr].get_point(), \ incr)#self.txt[self.line_ptr].get_point() + incr) dprint('del b ' + str(self.txt[self.line_ptr].get_point())) # self.pointasdf does not change for delete. # #self.display_line() for j in range(incr * direction): self.win_del_char(self.scrn, self.line_ptr, self.txt[self.line_ptr].get_point() + adj) if direction < 0: adj -= 1 return(0)
def key_in(t, w, c): if c == curses.KEY_F2: do_note(t, w) elif c == curses.KEY_F4: t.do_new_week() elif c == curses.KEY_F6: t.do_new_day() elif c == curses.KEY_F8: t.do_start_stop() elif c == curses.KEY_UP: t.cursor_up() elif c == curses.KEY_DOWN: t.cursor_down() elif c == curses.KEY_NPAGE: t.cursor_page_down() elif c == curses.KEY_PPAGE: t.cursor_page_up() elif c == curses.KEY_HOME: t.cursor_home() elif c == curses.KEY_END: t.cursor_end() elif (c < 256) and ( chr(c) in 'Mm' ) : do_topmenu(t, w) elif (c < 256) and ( chr(c) in 'Qq' ) : return True else: print "???" curses.beep() time.sleep(1) return False
def next_move(self, key): """Advance game one step, using key press""" state = self.get_state() if key == curses.KEY_LEFT: self.left_move() elif key == curses.KEY_RIGHT: self.right_move() elif key == curses.KEY_UP: self.up_move() elif key == curses.KEY_DOWN: self.down_move() self.refresh_all() if self.is_winner() and not self.won: self.won = True self.win_routine() if self.illegal_move(state): if self.is_loser(): self.lose_routine() self.refresh_all() curses.beep() return else: curses.beep() return else: self.insert_random() self.refresh_all()
def insert_txt(self, mode): '''MainWindow.insert_txt() Insert text at the current cursor location. If mode = 'i', then insert text starting at the cursor location. If mode = 'a' then insert after the current character. ''' global g_my_codec (max_y, max_x) = self.scrn.getmaxyx() max_y -= YFUDGE vline_len = len(self.txt[self.line_ptr]) if mode == 'a': # 'a' means insert text after the current character, # so increment the column if there is room to do so. self.incr_point(1)# Also adjusts cursor i = self.scrn.getch() b_mode = False #while i not in [27, 10, 13] and self.wincol_idx < max_x : while i not in [27] and self.wincol_idx < (max_x - 1) : # while ESC not pressed #if i > 126 or i < 20: # c = chr(i).encode(g_my_codec) #else: c = chr(i) self.status_message(ch=c)#show for debugging if i > 127: curses.beep() if i >> 6 == 3: # This is a two-byte unicode character i2 = self.scrn.getch() b = bytes([i, i2]) c = b.decode(g_my_codec) if i >> 6 == 7: # three byte unicode character i2 = self.scrn.getch() i3 = self.scrn.getch() b = bytes([i, i2, i3]) c = b.decode(g_my_codec) if (len(self.txt[self.line_ptr]) < (max_x - 1) \ and len(self.txt) < (max_x - 1) and i >= 32) \ or c == os.linesep: # Exclude control characters below 0x20 = 32decimal #self.txt[self.line_ptr].insert(self.txt[self.line_ptr].get_point(), c) self.txt.insert(self.pointasdf, c, batch=b_mode) b_mode = True self.incr_point(1)# also adjusts cursor #self.display_line() self.win_ins_char(self.scrn, self.line_ptr, self.txt[self.line_ptr].get_point() - 1, c) else: # FOR THIS CRIPPLED VERSION, DON'T PROCESS EXTRA CHARACTERS self.menuscrn.leaveok(1) #set flag to leave cursor alone self.menuscrn.addstr(MENU_LINES - 1, 0, 'ERROR. LINES MUST FIT ON THE SCREEN.') self.menuscrn.refresh() self.menuscrn.leaveok(0) i = self.scrn.getch() return(0)
def remind(self, id=0): if not id in self.tasks: return self.api.information('Task %s: %s' % (id, self.tasks[id][1]), 'Info') if self.config.get('beep', '') == 'true': curses.beep() timed_event = timed_events.DelayedEvent(self.tasks[id][0], self.remind, id) self.api.add_timed_event(timed_event)
def use_mouse_event(self, mouse_event): wg = self.find_mouse_handler(mouse_event) if wg: self.set_editing(wg) if hasattr(wg, 'handle_mouse_event'): wg.handle_mouse_event(mouse_event) else: curses.beep()
def scrollDown(self): """Scrolls the window down one line""" if self.__firstShownLine < len(self.__data) - 1: self.__firstShownLine += 1 self.__refreshContent() self.__printRow(self.__firstShownLine + self.height - 2) else: curses.beep()
def hl(tab): if tab.state != 'current': tab.state = 'private' conv_jid = safeJID(tab.name) if 'private' in config.get('beep_on', 'highlight private').split(): if not config.get_by_tabname('disable_beep', conv_jid.bare, default=False): curses.beep()
def error(self, msg): ew = self.createErrorWindow() ew.echo(str(msg)) ew.repaint() curses.beep() time.sleep(2) self.errorWindow = None self.refresh()
def drawMessage(title, msgs=[], waitKeyMsg=None, beep=False, flash=False): """ title: the title on the top like ' === TEXT === ' msgs: [[str(message), int(color_pair)],[...]] You should keep len(msgs) <= 6 if you used 'waitKeyMsg' The maximum of the length is 7 (msgs[6]). If you didn't use 'waitKeyMsg', you can use msgs[6] waitKeyMsg: If it is None, this function will return immediately after drawing, or it will print 'waitKeyMsg' and wait a key. beep: It will beep if it is True flash: The screen will flash if it is True """ if g.lastInfo == (title, msgs, waitKeyMsg, beep, flash): return # It needn't redraw. g.lastInfo = (title, msgs, waitKeyMsg, beep, flash) # Do some preparation (scry, scrx) = g.scr.getmaxyx() assert scrx >= 50 # Console should be big enough assert scry > 8 # Console should be big enough g.scr.clear() # Start to draw g.scr.addstr(0, 0, ' ' * scrx * 8) # Draw background # At the first line, draw title in center, with color pair of 2, # like this:' === TEXT === ' g.scr.addstr(0, 1, center2(' %s ' % title, scrx - 2, '='), curses.color_pair(2)) for i, msg in enumerate(msgs[:7]): msg[0] = msg[0].replace('\n', '_').replace('\r', '_') # no CR/LF if i == 6: space = 1 else: space = 2 msg[0] = limitLen( msg[0], g.scr.getmaxyx()[1] - space * 2) # Keep it in a line with 'space' spaces in 2 sides g.scr.addstr(1 + i, 1, ' ' * (scrx - 2), curses.color_pair(msg[1])) # Fill this line g.scr.addstr(1 + i, space, msg[0], curses.color_pair(msg[1])) # Draw a message if waitKeyMsg is not None: waitKeyMsg = limitLen(waitKeyMsg, g.scr.getmaxyx()[1] - 2) g.scr.addstr(7, 1, waitKeyMsg, curses.color_pair(1)) copyright = threelize('(C) 克兰软件工作室, 2010.', g.cText, 'cjxgm (兰威举)', scrx - 2) g.scr.addstr(8, 1, copyright, curses.color_pair(7)) g.scr.refresh() # Some tricks if beep == True: curses.beep() if flash == True: for i in range(2): curses.flash() time.sleep(0.1) # Do interactivation if waitKeyMsg is not None: g.scr.nodelay(False) return g.scr.getch()
def look_out(msecs): curses.napms(msecs) if stdscr.getch() != -1: curses.beep() sys.exit(0)
def show_brief_message(self, message): curses.beep() keep_for_a_moment = self.value self.value = message self.editing=False self.display() curses.napms(1200) self.editing=True self.value = keep_for_a_moment
def auto_complete(self, keycode): if not self.value: suggestions = self.commands.keys() self.value = suggestions[self.get_choice(suggestions)] if not self.value[-1].isalnum(): curses.beep() return self.value = self.value + ' ' self.cursor_position = len(self.value)
async def explode(canvas, center_row, center_column): rows, columns = get_frame_size(EXPLOSION_FRAMES[0]) corner_row = center_row - rows / 2 corner_column = center_column - columns / 2 curses.beep() for frame in EXPLOSION_FRAMES: draw_frame(canvas, corner_row, corner_column, frame) await asyncio.sleep(0) draw_frame(canvas, corner_row, corner_column, frame, negative=True) await asyncio.sleep(0)
async def explode(canvas, center_row, center_column): rows, columns = get_frame_size(EXPLOSION_FRAMES[0]) corner_row = center_row - rows / 2 corner_column = center_column - columns / 2 # Subtract 4 columns to get rid of tabs in explosion frames corner_column -= 4 beep() for frame in EXPLOSION_FRAMES: draw_frame(canvas, corner_row, corner_column, frame) await asyncio.sleep(0) draw_frame(canvas, corner_row, corner_column, frame, negative=True) await asyncio.sleep(0)
def affichage_aire_de_jeu(hauteur, largeur, titre): win = curses.newwin(hauteur, largeur, 0, 0) win.keypad(1) curses.noecho() curses.curs_set(0) win.nodelay(1) win.box() curses.init_pair(2, curses.COLOR_RED, curses.COLOR_WHITE) win.addstr(0, 27, titre, curses.color_pair(2)) win.refresh() curses.beep() return win
def reveal(self): safe = self.minefield.reveal(self.minePointer) if not safe: self.minefield.revealMines() self.ui.drawEntireBoard() self.complete = True curses.beep() time.sleep(5) else: self.ui.drawEntireBoard() if self.minefield.spacesLeft == 0: curses.beep() self.complete = True
def auto_complete(self, input): self.value = os.path.expanduser(self.value) directory, fname = os.path.split(self.value) # Let's have absolute paths. directory = os.path.abspath(directory) if self.value == '': self.value=directory try: flist = os.listdir(directory) except Exception: self.show_brief_message("Can't read directory!") return False flist = [os.path.join(directory, x) for x in flist] possibilities = list(filter( (lambda x: os.path.split(x)[1].startswith(fname)), flist )) if len(possibilities) == 0: # can't complete curses.beep() self.cursor_position = len(self.value) elif len(possibilities) == 1: if self.value != possibilities[0]: self.value = possibilities[0] if os.path.isdir(self.value) \ and not self.value.endswith(os.sep): self.value = self.value + os.sep self.cursor_position = len(self.value) elif len(possibilities) > 1: self.value = os.path.commonprefix(possibilities) self.cursor_position = len(self.value) curses.beep() if os.path.isdir(self.value) and len(possibilities) < 2: self.parent.wMain.change_dir(self.value) if os.path.isdir(self.value) \ and not self.value.endswith(os.sep): self.value = self.value + os.sep self.cursor_position = len(self.value) #self.h_exit_up(None) else: self.parent.value = directory self.parent.update_grid()
def cars_func(): global race_cars car_id = "" owners_name = "" s = curses.newwin(6, 25, 2, 1) s.box() s.addstr(1, 2, "A", hotkey_attr) s.addstr(1, 3, "dd a Racer", menu_attr) s.addstr(2, 2, "L", hotkey_attr) s.addstr(2, 3, "ist Racers", menu_attr) s.addstr(3, 2, "G", hotkey_attr) s.addstr(3, 3, "et Cars From File", menu_attr) s.addstr(1, 2, "", hotkey_attr) #Reset Cursor Locaton s.refresh() c = s.getch() if c in (ord('A'), ord('a')): s1 = curses.newwin(6, 35, 3, 3) s1.box() curses.echo() curses.curs_set(1) s1.addstr(1, 1, "Add New Race Car Owner:") correct = False while not correct: s1.addstr(2, 1, " Car ID:" + " " * 20) s1.addstr(3, 1, "Owners Name:" + " " * 20) s1.addstr(4, 1, " " * 20) s1.refresh() car_id = byte_to_str(s1.getstr(2, 14, 3)) owners_name = byte_to_str(s1.getstr(3, 14, 20)) s1.addstr(4, 1, "OK (Y/N)") c = s1.getch() if c in (ord('N'), ord('n')): correct = False else: correct = True race_cars[car_id] = Awana_Car(car_id, owners_name) save_car_to_file(race_cars[car_id]) curses.noecho() curses.curs_set(0) s1.erase() elif c in (ord('L'), ord('l')): list_the_cars() elif c in (ord('G'), ord('g')): if get_cars_from_file(): list_the_cars() else: curses.beep() curses.flash() s.erase() return CONTINUE
def selection_traceback(self): if not self.selected_task: return curses.beep() task = self.state.tasks[self.selected_task] if task.state not in states.EXCEPTION_STATES: return curses.beep() def alert_callback(my, mx, xs): y = count(xs).next for line in task.traceback.split("\n"): self.win.addstr(y(), 3, line) return self.alert(alert_callback, "Task Exception Traceback for %s" % self.selected_task)
async def fire(canvas, obstacles, obstacles_collisions, start_row, start_column, rows_speed=-0.3, columns_speed=0): """Display animation of gun shot. Direction and speed can be specified.""" row, column = start_row, start_column canvas.addstr(round(row), round(column), '.') await asyncio.sleep(0) canvas.addstr(round(row), round(column), '+') await asyncio.sleep(0) canvas.addstr(round(row), round(column), '*') await asyncio.sleep(0) canvas.addstr(round(row), round(column), ' ') row += rows_speed column += columns_speed symbol = '-' if columns_speed else '|' rows, columns = canvas.getmaxyx() max_row, max_column = rows - 1, columns - 1 curses.beep() while 1 < row < max_row and 0 < column < max_column: canvas.addstr(round(row), round(column), symbol) await asyncio.sleep(0) canvas.addstr(round(row), round(column), ' ') row += rows_speed column += columns_speed collisions = set( filter(lambda o: o.has_collision(row, column), obstacles)) if collisions: obstacles_collisions.update(collisions) return
def mange_pomme(self, win: curses, pommes: list) -> bool: miam = False for pomme in pommes: if self.tete() == pomme.get_xy(): curses.beep() miam = True pomme.afficher() while pomme.get_xy() in self.snake: pomme.afficher() if not miam: win.addstr(self.snake[-1][0], self.snake[-1][1], ' ', curses.color_pair(1)) win.refresh() self.snake.pop() return miam
def selection_traceback(self): if not self.selected_task: return curses.beep() task = self.state.tasks[self.selected_task] if task.state not in states.EXCEPTION_STATES: return curses.beep() def alert_callback(my, mx, xs): y = count(xs) for line in task.traceback.split('\n'): self.win.addstr(next(y), 3, line) return self.alert(alert_callback, 'Task Exception Traceback for {0.selected_task}'.format(self))
def draw_exception(self, exception): """Draw exception and wait for keypress. :exception: exits the program if user presses 'Q' """ curses.beep() message = str(exception) + " Press any key to continue" self.screen.addstr(self.height, 0, message, self.color_exception) try: self.screen.nodelay(False) ch = self.screen.getch() if ch != -1 and chr(ch) == 'q': exit() finally: self.screen.addstr(self.height, 0, message, self.color_clear)
def mainloop(scr): curses.mousemask(curses.ALL_MOUSE_EVENTS ) #curses.BUTTON1_PRESSED)#curses.ALL_MOUSE_EVENTS) while 1: scr.keypad(1) curses.halfdelay(1) ch = scr.getch() if ch == "-1": scr.addstr(2, 0, '-1') scr.addstr(2, 0, str(ch)) if ch == curses.KEY_MOUSE: scr.addstr(4, 0, "%s" % ' '.join(str(curses.getmouse()))) curses.beep() #return ch scr.refresh()
def do_command(self, ch): if curses.ascii.isprint(ch) or ch == curses.ascii.LF: text_window_height, text_window_width = self.text_window.getmaxyx() y, x = size_as_drawn((self.get_content() + chr(ch)).split('\n'), text_window_width) if y < text_window_height - 1 and x < text_window_width: self.content.insert(self.cursor_pos, chr(ch)) self.cursor_pos += 1 else: curses.beep() elif ch == curses.KEY_BACKSPACE: if self.cursor_pos > 0: del self.content[self.cursor_pos - 1] self.cursor_pos -= 1 else: curses.beep() elif ch == curses.KEY_DC: if self.cursor_pos >= 0 and self.cursor_pos < len(self.content): del self.content[self.cursor_pos] else: curses.beep() elif ch == curses.KEY_LEFT: if self.cursor_pos > 0: self.cursor_pos -= 1 else: curses.beep() elif ch == curses.KEY_RIGHT: if self.cursor_pos + 1 <= len(self.content): self.cursor_pos += 1 else: curses.beep() elif ch in (curses.ascii.EOT, curses.ascii.RS): # ^D or (for some terminals) Ctrl+Enter return False, False elif ch == curses.ascii.ESC: self.clear() return False, True elif ch == curses.KEY_RESIZE: self.on_resize() return True, False self.refresh_text() return True, False
def letsstart(): if __name__ == '__main__': curses.initscr() curses.beep() curses.beep() window = curses.newwin(HEIGHT, WIDTH, 0, 0) window.timeout(Speed) window.keypad(1) curses.noecho() curses.curs_set(0) window.border(0) snake = Snake(SNAKE_X, SNAKE_Y, window) food = Food(window, "'") obstacl = obstacle(window, "# # # #") while True: window.clear() window.border(0) snake.render() food.render() obstacl.render() window.addstr(0, 5, snake.score) event = window.getch() if event == 27: break if event in [KEY_UP, KEY_DOWN, KEY_LEFT, KEY_RIGHT]: snake.change_direction(event) if snake.head.x == food.x and snake.head.y == food.y: snake.eat_food(food) if event == 32: key = -1 while key != 32: key = window.getch() if snake.head.x == obstacl.x and snake.head.y == obstacl.y: break snake.update() if snake.collided: break curses.endwin()
def GameOver(sefl, window): window.clear() window.border() msg = "Game Over!" centro = round((60 - len(msg)) / 2) window.addstr(10, centro, msg) window.timeout(-1) curses.beep() q = None while q not in (ord("\n"), ord("m"), ord("q")): q = window.getch() if q == ord("q"): option = "quit" break return option
def main(stdscr): global STDSCR STDSCR = stdscr init() direction = RIGHT_KEY tail = [] end = False while not end: last_direction = direction direction = get_direction(last_direction) tail, end = move(tail, last_direction, direction) curses.beep() time.sleep(3)
def topbar_key_handler(key_assign=None, key_dict={}): screen.addstr(1, 40, "Lanes in Use: " + str(cars_in_the_race) + " ") screen.refresh() if key_assign: key_dict[ord(key_assign[0])] = key_assign[1] else: screen.refresh() c = screen.getch() if c in (curses.KEY_END, ord('!')): return 0 elif c not in key_dict.keys(): curses.beep() return 1 else: return eval(key_dict[c])
async def explode(canvas: Window, center_row: int, center_column: int) -> None: """Boom animation.""" rows: int columns: int rows, columns = get_frame_size(EXPLOSION_FRAMES[0]) corner_row = int(center_row - rows / 2) corner_column = int(center_column - columns / 2) curses.beep() for frame in EXPLOSION_FRAMES: draw_frame(canvas, corner_row, corner_column, frame) await eventloop.sleep(1) draw_frame(canvas, corner_row, corner_column, frame, negative=True) await eventloop.sleep(1)
def print_snake(self, check_dead=True): maxes = self.screen.getmaxyx() self.screen.clear() self.screen.border() if self.display_scores: interval = int(maxes[1] / 4) if interval < 12: p_string = "P: " w_string = "W: " s_string = "S: " l_string = "L: " else: p_string = "Points: " w_string = "Walls: " s_string = "Speed: " l_string = "Level: " self.screen.addstr(0, 2, l_string + str(int(self.level))) self.screen.addstr( 0, 2 + interval, p_string + str(int(self.points)) + ' of ' + str(int(self.start_points + self.level_up))) self.screen.addstr(0, 2 + (interval * 2), w_string + str(self.walls)) self.screen.addstr(0, 2 + (interval * 3), s_string + str(round(self.speed, 2))) if len(self.snake.a) < self.min_apples: self.snake.apple(maxes) if self.snake.eat(self.growth): curses.beep() self.points = self.points + self.walls if self.snake.dead(maxes) and check_dead: raise SnakeDead for i in range(self.snake.l): if i == 0: char = DIRECTION[self.snake.d] else: char = '*' self.screen.addstr(self.snake.p[i].y, (self.snake.p[i].x * 2), char) for i in range(len(self.snake.a)): self.screen.addstr(self.snake.a[i].y, (self.snake.a[i].x * 2), self.apple_char, curses.color_pair(2) | curses.A_BOLD) for i in range(len(self.snake.b)): self.screen.addstr(self.snake.b[i].y, (self.snake.b[i].x * 2), self.blocking_char, curses.color_pair(3) | curses.A_BOLD) self.screen.refresh()
def jeu(win): ''' Moteur du jeu paramètre : win : fenètre en cours retour : score à la fin du jeu ''' # initialisation du jeu # Le serpent se dirige vers la droite au début du jeu. # C'est comme si le joueur avait utilisé la flèche droite au clavier key = KEY_RIGHT score = 0 # Definition des coordonnées du serpent # Le serpent est une liste de d'anneaux composées de leurs coordonnées ligne, colonne # La tête du serpent est en 4,10, l'anneau 1 en 4,9, le 2 en 4,8 snake = [[4, 10], [4, 9], [4, 8]] # La nouriture (pomme) se trouve en 10,20 food = [10, 20] # Affichage la nouriture en vert sur fond noir dans la fenêtre curses.init_pair(2, curses.COLOR_GREEN, curses.COLOR_BLACK) win.addch(food[0], food[1], chr(211), curses.color_pair(2)) # Prints the food # Affichage du serpent en bleu sur fond jaune curses.init_pair(3, curses.COLOR_BLUE, curses.COLOR_YELLOW) # sur toute la longeur du serpent for i in range(len(snake)): # affichage de chaque anneau dans la fenêtre en ligne, colonne win.addstr(snake[i][0], snake[i][1], '*', curses.color_pair(3)) # Emission d'un beep au début du jeu curses.beep() end = False # Tant que le joueur n'a pas quitter le jeu while key != 27 and not end: key = controle(win, key) snake, score = deplacement(win, score, key, snake, food) end = perdu(win, snake) return score
def move_snake(snake, key, snake_num, score): global win global food global move if snake_num == 1: snake.insert(0, [ snake[0][0] + ((key == 115 or key == 83) and 1) + ((key == 119 or key == 87) and -1), snake[0][1] + ((key == 97 or key == 65) and -1) + ((key == 100 or key == 68) and 1) ]) elif snake_num == 2: snake.insert(0, [ snake[0][0] + (key == KEY_DOWN and 1) + (key == KEY_UP and -1), snake[0][1] + (key == KEY_LEFT and -1) + (key == KEY_RIGHT and 1) ]) # If snake crosses the boundaries, make it enter from the other side if snake[0][0] == 0: snake[0][0] = 18 if snake[0][1] == 0: snake[0][1] = 58 if snake[0][0] == 19: snake[0][0] = 1 if snake[0][1] == 59: snake[0][1] = 1 # If snake runs over itself if snake[0] in snake[1:]: win.addstr(0, 27, 'You Lose') move = False if move: if snake[0] == food: curses.beep() food = [] score += 1 while food == []: food = [randint(1, 18), randint(1, 58)] if food in snake: food = [] win.addch(food[0], food[1], '*') else: last = snake.pop() win.addch(last[0], last[1], ' ') win.addch(snake[0][0], snake[0][1], '#') return score
def _prev_search_match(self, times=1): if not self.search_term: curses.beep() return moved = False for n in range(0, times): possible_matches = self.content()[:self.highlight_line] for i, line in enumerate(reversed(possible_matches)): if self.search_term in line.line: self.highlight_line -= i + 1 moved = True break if not moved: curses.beep()
def timer_thread_function(): """A function meant to be ran in a thread that checks whether or not a timer should go off now.""" while True: for i, timer in enumerate(superglobals.timer_list): if timer.seconds - time.perf_counter() <= 0 and timer.bits & 0b01: superglobals.timer_list[i].bits &= 0b10 for _ in range(10): curses.beep() time.sleep(0.05) for i, countdown in enumerate(superglobals.countdown_list): if countdown.seconds - time.perf_counter() <= 0 and \ countdown.bits & 0b01: superglobals.countdown_list[i].bits &= 0b00 for _ in range(10): curses.beep() time.sleep(0.05)
def selection_rate_limit(self): if not self.selected_task: return curses.beep() task = self.state.tasks[self.selected_task] if not task.name: return curses.beep() my, mx = self.win.getmaxyx() r = "New rate limit: " self.win.addstr(my - 2, 3, r, curses.A_BOLD | curses.A_UNDERLINE) self.win.addstr(my - 2, len(r) + 3, " " * (mx - len(r))) rlimit = self.readline(my - 2, 3 + len(r)) if rlimit: reply = control.rate_limit(task.name, rlimit.strip(), reply=True) self.alert_remote_control_reply(reply)
async def fire(canvas: Window, start_row: float, start_column: float, rows_speed: float = -0.3, columns_speed: int = 0) -> None: """Display animation of gun shot, direction and speed can be specified.""" row: float column: float rows: int columns: int max_row: int max_column: int row, column = start_row, start_column canvas.addstr(round(row), round(column), '*') await eventloop.sleep(1) canvas.addstr(round(row), round(column), 'O') await eventloop.sleep(1) canvas.addstr(round(row), round(column), ' ') row += rows_speed column += columns_speed symbol: str = '-' if columns_speed else '|' rows, columns = getmaxyx_border(canvas) max_row, max_column = rows - 1, columns - 1 curses.beep() while 1 < row < max_row and 1 < column < max_column: collision: bool = False for obstacle in obstacles: if obstacle.has_collision(row, column, 1, 1): collision = True obstacles_in_last_collisions.append(obstacle) break if collision: break canvas.addstr(round(row), round(column), symbol) await eventloop.sleep(1) canvas.addstr(round(row), round(column), ' ') row += rows_speed column += columns_speed
def challenge_word(self, word): """runs a typing challenge loop and returns (word, attempts, seconds_elapsed) """ prompt = "\n$ %s\n> " % (word) start_time = timeit.default_timer() started = True attempts = 1 correct = False char_index = 0 answer = "" while started or not correct: started = False self.prompt(word) c = self.win_panel.window().getch() # escape key if c == 27: sys.exit(0) answer = answer + chr(c) self.echo_bar(answer) if chr(c) == word[char_index]: char_index += 1 if char_index == len(word): correct = True elapsed = timeit.default_timer() - start_time self.echo_bar("") #self.echo_bar("CORRECT! %s %s" % (attempts, elapsed)) return { "word": word, "attempts": attempts, "time": elapsed } else: attempts += 1 correct = False char_index = 0 answer = "" curses.beep() #self.win_panel.window().refresh() self.echo_bar("")
async def fire(canvas, start_row, start_column, rows_speed=-0.3, columns_speed=0): """Display animation of gun shot, direction and speed can be specified.""" row, column = start_row, start_column for symb in '*O ': await sleep(1) canvas.addstr(round(row), round(column), symb) row += rows_speed column += columns_speed symbol = '-' if columns_speed else '|' rows, columns = canvas.getmaxyx() max_row, max_column = rows - 1, columns - 1 curses.beep() shot_obstacles = create_frame_obstacles(row, column, symbol, uid=uid_shot_name) while 0 < row < max_row and 0 < column < max_column: canvas.addstr(round(row), round(column), symbol) await sleep(1) canvas.addstr(round(row), round(column), ' ') row += rows_speed column += columns_speed shot_obstacles.row += rows_speed shot_obstacles.column += columns_speed for obstacle in OBSTACLES: if obstacle.uid == uid_garbage_name and \ obstacle.has_collision(obj_corner_row=shot_obstacles.row, obj_corner_column=shot_obstacles.column, obj_size_rows=shot_obstacles.rows_size, obj_size_columns=shot_obstacles.columns_size): OBSTACLES_IN_LAST_COLLISIONS.append(obstacle) OBSTACLES.remove(shot_obstacles) return None if shot_obstacles in OBSTACLES: OBSTACLES.remove(shot_obstacles) return None
def affichage_aire_de_jeu(self, titre: str) -> curses: curses.initscr() curses.start_color() curses.init_pair(2, curses.COLOR_RED, curses.COLOR_WHITE) curses.init_pair(3, curses.COLOR_BLUE, curses.COLOR_YELLOW) curses.init_pair(4, curses.COLOR_WHITE, curses.COLOR_RED) win = curses.newwin(self.hauteur, self.largeur, 0, 0) win.keypad(1) curses.noecho() curses.curs_set(0) win.nodelay(1) win.box() win.addstr(0, self.largeur // 2 - len(titre) // 2, titre, curses.color_pair(2)) win.refresh() curses.beep() return win
def UpdateSearch(self): if not self.search: return if not self.search.done(): return curses.flash() curses.beep() self.state['moveready'] = True idx = 0 if self.state['board'].turn else 1 self.state['timer'][idx] += INCREMENT_MS self.state['movetimer'][1 - idx] = 0 self.state['board'].push(self.search.result().bestmove) self.state['nextmove'] = '' self.search = None self.StartSearch()
def mange_pomme(win, food, snake, score): ''' Le serpent a-t-il mangé la pomme ? paramètres : win : fenètre en cours food : liste des coordonnées de la pomme snake : liste des coordonnées des anneaux du serpent score : score en cours retour : Tuple constitué de : - la liste des coordonnées actualisées de la pomme, - la liste des coordonnées du serpent, - la liste des coordonnées du dernier anneau à supprimer - le score en cours ''' # initialisation de la liste contenant les coordonnées du dernier anneau du serpent last = [0, 0] # Si le serpent a mangé la pomme if snake[0] == food: # Emettre un beep curses.beep() # incrémenter le score score += 1 # Réactualiser les coordonnées de la pomme # On recommence tant que les coordonnées de la pomme sont dans le serpent while food in snake: # On actualise au hasard les coordonnées de la pomme # dans les limite de la fenêtre # voir la documentation de la fonction window.getmaxyx() food[0] = randint(1, win.getmaxyx()[0] - 2) food[1] = randint(1, win.getmaxyx()[1] - 2) # Affichage de la pomme aux nouvelles coordonnées en vert sur fond noir win.addch(food[0], food[1], chr(211), curses.color_pair(2)) win.refresh() # Sinon else: # Suppression du dernier anneau du serpent last = snake.pop() return food, snake, last, score