Obtenir une entrée non bloquante dans la console
Lors de la création d'applications interactives, il est souvent nécessaire d'accepter les entrées de l'utilisateur sans interrompre les processus en cours. Cela se produit dans des situations telles que le développement de clients IRC, où une boucle reçoit et interprète en permanence les réponses du serveur.
Énoncé du problème
En Python, l'utilisation de raw_input pour l'entrée de la console arrête la boucle. jusqu'à ce que l'utilisateur fournisse une entrée. Pour obtenir une saisie non bloquante, nous avons besoin d'une approche alternative.
Solutions
Pour les utilisateurs Windows travaillant uniquement avec la saisie de la console, le module msvcrt est disponible :
import msvcrt num = 0 done = False while not done: print(num) num += 1 if msvcrt.kbhit(): print("you pressed", msvcrt.getch(), "so now I will quit") done = True
Pour les environnements Linux, le module termios propose une solution :
import sys import select import tty import termios def isData(): return select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], []) old_settings = termios.tcgetattr(sys.stdin) try: tty.setcbreak(sys.stdin.fileno()) i = 0 while 1: print(i) i += 1 if isData(): c = sys.stdin.read(1) if c == '\x1b': # x1b is ESC break finally: termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)
Pour les plateformes跨ou lorsque vous incluez une interface graphique dans votre application, Pygame est une option polyvalente :
import pygame from pygame.locals import * def display(str): text = font.render(str, True, (255, 255, 255), (159, 182, 205)) textRect = text.get_rect() textRect.centerx = screen.get_rect().centerx textRect.centery = screen.get_rect().centery screen.blit(text, textRect) pygame.display.update() pygame.init() screen = pygame.display.set_mode( (640,480) ) pygame.display.set_caption('Python numbers') screen.fill((159, 182, 205)) font = pygame.font.Font(None, 17) num = 0 done = False while not done: display( str(num) ) num += 1 pygame.event.pump() keys = pygame.key.get_pressed() if keys[K_ESCAPE]: done = True
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!