Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Terminal Control Functions ใน Python (โมดูล tty)

โมดูล tty ควบคุม Terminal Mode ใน UNIX: ตั้งค่า Raw Mode และ Cbreak Mode เพื่ออ่าน Input ทันทีไม่ต้องกด Enter

import tty (ต้องใช้ร่วม termios)


โหมด Terminal

โหมดคุณสมบัติ
Raw Mode
  • Input ส่งทันทีทุกตัวอักษร (ไม่รอ Enter)
  • ไม่มี Line Editing (Backspace, Ctrl+U ไม่ทำงาน)
  • ไม่มี Signal Processing (Ctrl+C, Ctrl+Z ไม่ทำงาน)
  • Cursor ไปบรรทัดใหม่แต่ไม่ Carriage Return
Cbreak Mode
  • Input ส่งทันทีทุกตัวอักษร
  • มี Signal Processing (Ctrl+C ทำงานได้)
  • เหมาะสำหรับ Interactive Program

เมธอดหลัก

tty.setraw(fd, when=termios.TCSAFLUSH)

ตั้งค่า Raw Mode

tty.setcbreak(fd, when=termios.TCSAFLUSH)

ตั้งค่า Cbreak Mode

when Parameter (จาก termios):

  • TCSANOW - ใช้ทันที
  • TCSADRAIN - รอ Output หมดก่อน
  • TCSAFLUSH - รอ Output หมด + Flush Input (Default)

โค้ดตัวอย่าง: อ่านตัวอักษรทีละตัว

import sys
import tty
import termios

fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)

try:
    tty.setraw(fd)
    print("Press 5 keys (no Enter needed):")
    for i in range(5):
        ch = sys.stdin.read(1)
        print(f"Char: {repr(ch)}")
finally:
    # คืนค่า Terminal Settings เดิม (สำคัญมาก!)
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)

ผลลัพธ์

Press 5 keys (no Enter needed):
Char: 'K'
Char: 'E'
Char: '5'
Char: '2'
Char: '@'

กรณีใช้งานจริง

  • Password Input (ไม่แสดงตัวอักษร - ใช้ร่วม termios.ECHO)
  • Game/Interactive CLI (Real-time Key Press)
  • Menu Navigation (Arrow Keys)
  • REPL/Shell Development

⚠️ ข้อควรระวังสำคัญ

  1. ต้อง Restore Settings เสมอ - ใช้ try/finally ไม่เช่นนั้น Terminal จะค้าง Raw Mode
  2. Windows: ใช้ msvcrt.getch() แทน
  3. Signal Handling: Raw Mode ปิด Ctrl+C ต้องจัดการเอง