器→工具, 编程语言

Python标准库之终端处理

钱魏Way · · 33 次浏览

curses:终端处理

curses 模块是 Python 标准库中用于创建终端用户界面的模块,主要用于开发基于文本的界面程序。它提供了用于处理终端窗口、绘制文本、捕获用户输入等功能的接口。

主要功能

  • 终端控制:控制终端的屏幕内容,处理光标位置、窗口大小等。
  • 绘制界面:在终端中绘制复杂的用户界面元素,如窗口、面板、表格等。
  • 用户输入:处理用户输入,包括键盘按键、鼠标事件等。
  • 颜色支持:支持在终端中使用不同的颜色进行文本输出。

使用场景

  • 文本用户界面:创建基于终端的用户界面,例如控制台应用程序的菜单和表单。
  • 游戏开发:开发基于终端的简单游戏,如文字冒险游戏。
  • 终端工具:实现功能丰富的终端工具,如文件浏览器、监控工具等。

注意事项

  • 兼容性:curses 主要用于 Unix 类系统,Windows 上可能需要额外的安装步骤或使用其他库(如 windows-curses)。
  • 复杂性:curses 模块提供了强大的功能,但学习曲线较陡峭,开发复杂的用户界面可能需要深入了解其 API。
  • 性能:在处理大量更新时,注意优化性能,避免频繁的屏幕刷新的操作。

curses 模块是一个功能强大的工具,用于在终端中创建交互式用户界面。尽管它的学习曲线较陡峭,但对于需要基于终端的复杂界面的应用程序来说,它是一个非常有用的工具。

初始化和终止

  • initscr():初始化 curses 模块,创建一个窗口对象,通常是整个屏幕。返回一个 window 对象,代表终端的主要窗口。
  • endwin():终止 curses 模块的使用,恢复终端的正常显示模式。

示例:

import curses

def main(stdscr):
    stdscr.addstr("Hello, world!")
    stdscr.refresh()
    stdscr.getch()

curses.wrapper(main)

在上面的示例中,curses.wrapper(main) 会自动调用 curses.initscr() 和 curses.endwin(),并将主窗口对象 (stdscr) 传递给 main 函数。

窗口和面板

  • newwin(nlines, ncols, begin_y, begin_x):创建一个新的窗口对象。
  • nlines:窗口的行数。
  • ncols:窗口的列数。
  • begin_y:窗口的起始行位置。
  • begin_x:窗口的起始列位置。
  • subwin(nlines, ncols, begin_y, begin_x):创建一个子窗口对象,子窗口从父窗口的指定位置开始。
  • newpad(nlines, ncols):创建一个可滚动的面板对象。
import curses

def main(stdscr):
    stdscr.clear()
    win = curses.newwin(10, 30, 5, 10)
    win.border()
    win.addstr(1, 1, "This is a new window")
    win.refresh()
    stdscr.getch()

curses.wrapper(main)

窗口操作

  • addstr(y, x, string):在窗口的指定位置添加字符串。
  • refresh():刷新窗口内容,使其更新到屏幕上。
  • getch():获取用户输入的单个字符。
  • clear():清空窗口内容。

示例:

import curses

def main(stdscr):
    stdscr.clear()
    stdscr.addstr(0, 0, "Press any key to continue...")
    stdscr.refresh()
    stdscr.getch()

curses.wrapper(main)

颜色和属性

  • start_color():启用颜色支持。
  • init_pair(pair, fg, bg):初始化颜色对。
    • pair:颜色对的编号。
    • fg:前景色的颜色编号。
    • bg:背景色的颜色编号。
  • color_pair(n):应用颜色对。

示例:

import curses

def main(stdscr):
    curses.start_color()
    curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK)
    stdscr.addstr(0, 0, "This is red text", curses.color_pair(1))
    stdscr.refresh()
    stdscr.getch()

curses.wrapper(main)

键盘输入

curses.keypad(onoff):启用或禁用特殊键的处理(如箭头键)。

window.getch():获取单个字符的输入,包括特殊键。

示例:

import curses

def main(stdscr):
    stdscr.clear()
    stdscr.addstr("Press arrow keys to see their codes.")
    stdscr.refresh()

    while True:
        key = stdscr.getch()
        if key == curses.KEY_UP:
            stdscr.addstr("Up arrow key pressed")
        elif key == curses.KEY_DOWN:
            stdscr.addstr("Down arrow key pressed")
        elif key == 27:  # ESC key to exit
            break

curses.wrapper(main)

getpass:隐藏输入密码

getpass 模块是 Python 标准库中的一个简单且专用的工具,用于在命令行界面中安全地获取用户输入,尤其是用于获取密码。它能够隐藏用户输入,以防止密码被其他人看到。

主要功能

  • 隐藏输入:在命令行中输入密码时,通常不会回显输入内容,以保护用户隐私。
  • 跨平台支持:支持在不同操作系统上获取隐藏输入,包括 Windows、Unix 和类 Unix 系统(如 Linux 和 macOS)。

getpass(prompt=’Password: ‘, stream=None)

功能:提示用户输入密码并返回输入的密码。密码在输入时不会显示。

参数:

  • prompt:提示用户输入的字符串(默认为 ‘Password: ‘)。这是一个字符串,用户看到的提示信息。
  • stream:输出流对象(默认为stderr)。用来显示提示信息。

返回:用户输入的密码(字符串类型)。

示例:

import getpass

password = getpass.getpass('Enter your password: ')
print('Password entered:', password)

注意事项

  • 安全性:getpass 的主要目的是隐藏输入,以提高安全性,但请确保在实际应用中,密码和其他敏感信息不会以明文形式存储或显示。
  • 平台兼容性:getpass 在不同平台上的实现可能有所不同。在某些平台上,可能需要额外的处理来确保其正常工作。
  • 输入长度:某些平台对隐藏输入的长度可能有限制,虽然通常这不会成为问题。

getpass 模块是一个简单而有效的工具,用于在命令行中安全地获取用户的敏感输入,避免密码或其他秘密信息被意外曝光。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注