Maison >développement back-end >Tutoriel Python >Comment puis-je implémenter une entrée de console non bloquante en Python pour les applications en temps réel ?

Comment puis-je implémenter une entrée de console non bloquante en Python pour les applications en temps réel ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-04 05:07:14723parcourir

How Can I Implement Non-Blocking Console Input in Python for Real-Time Applications?

Entrée de console non bloquante : déverrouillage de la gestion asynchrone

Considérez le scénario suivant : vous créez un client IRC en Python et avez établi une boucle pour recevoir et analyser les données du serveur. Cependant, lorsque vous utilisez raw_input pour saisir du texte, la boucle s'arrête brusquement jusqu'à ce que votre saisie soit terminée. Cette interruption gêne le bon fonctionnement de la boucle.

Pour relever ce défi et maintenir l'exécution continue de la boucle, différentes méthodes de saisie non bloquantes sont disponibles :

Pour Windows (Console uniquement ):

  • Utiliser le msvcrt module :
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 Linux :

  • Exploitez le module termios comme décrit dans cet article :
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 multiplateforme ou interface graphique Intégration :

  • Embrassez Pygame :
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

En adoptant ces techniques de saisie non bloquantes, vous pouvez intégrer de manière transparente les interactions des utilisateurs en temps réel sans perturber le flux de votre boucle IRC.

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