首頁 > 後端開發 > Python教學 > 如何在Python中取得非阻塞控制台輸入?

如何在Python中取得非阻塞控制台輸入?

Susan Sarandon
發布: 2024-12-02 14:10:13
原創
1001 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板