前言
要實作該功能,需要的就是暫停程式、等待并捕捉使用者的一個鍵盤輸入,然後繼續執行。Python 有内建的庫能幫我們實作該功能,不過要差別對待 Windows 和 Linux。
msvcrt中的 getch()方法 能夠幫助在 Windows 下實作,其作用是擷取一個按鍵響應并傳回對應的字元。它并不在指令行中回顯。有如下程式段:
import msvcrt
print ord(msvcrt.getch())
這裡利用 ord将獲得的字元轉換為 ASCII數值,例如捕獲按鍵"d"(注意是小寫)将得到數值100。
Linux 下呢?嗯,相對複雜一點點,不過先理清思路的話就好辦了。
首先要知曉一下 Linux 終端的三種模式,分别為規範模式、非規範模式和raw 模式:
規範模式
規範模式,也被成為 cooked模式,是使用者常見的模式。驅動程式輸入的字元儲存在緩沖區,并且僅在接收到Enter鍵時才将這些緩沖的字元發送到程式。緩沖資料使驅動程式可以實作最基本的編輯功能, 被指派這些功能的特定鍵在驅動程式裡設定,可以通過指令 stty或系統調用 tcsetattr來修改。
非規範模式
當緩沖和編輯功能被關閉時,連接配接被成為非規範模式。終端處理器仍舊進行特定的字元處理,例如處理 Ctrl-C 及換行符之間的轉換,但是編輯鍵将沒有意義,是以相應的輸入被視為正常的資料輸入,程式需要自己實作編輯功能。
raw 模式
當所有處理都被關閉後,驅動程式将輸入直接傳遞給程式,連接配接被成為 raw模式。
這裡我們需要借助于非規範模式,那麼要實作剛才 Windows 上的相似行為,需要以下代碼:
import os
import termios
# 擷取标準輸入的描述符
fd = sys.stdin.fileno()
# 擷取标準輸入(終端)的設定
old_ttyinfo = termios.tcgetattr(fd)
# 配置終端
new_ttyinfo = old_ttyinfo[:]
# 使用非規範模式(索引3是c_lflag 也就是本地模式)
new_ttyinfo[3] &= ~termios.ICANON
# 關閉回顯(輸入不會被顯示)
new_ttyinfo[3] &= ~termios.ECHO
# 使設定生效
termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo)
# 從終端讀取
print ord(os.read(fd, 7))
由此看來,我們隻需利用上面的方法捕獲一個按鍵響應,然後繼續程式即可做到按任意鍵繼續或退出的功能了。當然,做到按指定鍵繼續或退出的功能也可以按類似的方法實作,例如:
import msvcrt
print("Press 'D' to exit...")
while True:
if ord(msvcrt.getch()) in [68, 100]:
break
這樣,當使用者按下"D"或"d"時,則程式退出。
總結
以上就是Python實作按任意鍵繼續或退出的全部内容,希望本文的内容對大家學習Python能有所幫助。