Maison >développement back-end >Tutoriel Python >Comment obtenir une entrée de console non bloquante en Python ?

Comment obtenir une entrée de console non bloquante en Python ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-02 14:10:13947parcourir

How to Get Non-Blocking Console Input in Python?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn