首页 >后端开发 >Python教程 >如何在Python中获取非阻塞控制台输入?

如何在Python中获取非阻塞控制台输入?

Susan Sarandon
Susan Sarandon原创
2024-12-02 14:10:13947浏览

How to Get Non-Blocking Console Input in Python?

获取非阻塞控制台输入

创建交互式应用程序时,通常需要在不中断正在进行的进程的情况下接受用户输入。这种情况会出现在 IRC 客户端开发等情况下,其中循环不断接收并解释服务器响应。

问题陈述

在 Python 中,使用 raw_input 进行控制台输入会停止循环直到用户提供输入。为了实现非阻塞输入,我们需要另一种方法。

解决方案

对于仅使用控制台输入的 Windows 用户,可以使用 msvcrt 模块:

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

对于 Linux 环境,termios 模块提供了解决方案:

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)

对于跨平台或在应用程序中包含 GUI 时,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

以上是如何在Python中获取非阻塞控制台输入?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn