有时候linux系统没有界面,可能需要在terminal终端完成程序的交互和状态显示,C语言的ncurses支持命令行界面程序开发,curses是基于ncurses实现的python终端界面库。
本文实现一个简单的demo小程序,方便初学者学习和使用。
首先上demo主程序
#-*- coding: UTF-8 -*-
import curses
import locale
locale.setlocale(locale.LC_ALL, '')
def terminal_display(stdscr):
stdscr.leaveok(1) #配置光标随字符更新移动
curses.cbreak() #关闭行缓冲,禁用除中断和字符流控制以外的字符处理
curses.echo() #输入字符回显
stdscr.keypad(1) #开启特殊键盘按键响应
curses.start_color() #启用颜色功能
curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK) #更改颜色配对,序号,前景色(字颜色),背景色
curses.init_pair(2, curses.COLOR_YELLOW, curses.COLOR_BLACK)
curses.init_pair(3, curses.COLOR_RED, curses.COLOR_BLACK)
stdscr.clear() #清除屏幕
show_lines, line_len = stdscr.getmaxyx() #获取屏幕显示行数和每行字数
stdscr.addstr(0, 0, "屏幕行数:%s,行字符数:%s\n"%(show_lines,line_len))
stdscr.addstr(1, 0, "请输入一个整数:")
stdscr.refresh()
stdscr.nodelay(0)
input_num = int(stdscr.getstr())
stdscr.addstr(2, 0, "输入整数为:%s" % input_num)
stdscr.refresh()
stdscr.nodelay(1)
stdscr.addstr(3, 0, "这行应该是白色字体", curses.color_pair(0))#序号0为默认配置,不可更改
stdscr.addstr(4, 0, "这行应该是绿色字体", curses.color_pair(1))
stdscr.addstr(5, 0, "这行应该是黄色字体", curses.color_pair(2))
stdscr.addstr(6, 0, "这行应该是红色字体", curses.color_pair(3))
stdscr.refresh()
while 1:
pass
if __name__ == '__main__':
curses.wrapper(terminal_display)
调用后的结果大概如下图所示:
curses.wrapper是一个好东西,开始我没用wrapper,调用curses程序后,整个terminal也就乱掉了,回车没法换行,各种键盘按键无法响应。
curses.wrapper(terminal_display)的内部功能我猜测大概如下所示:
def wrapper(func, ...)
stdscr = curses.initscr()
...##记录terminal当前各个配置
func(stdscr,...)
...##恢复terminal到原来的样子
调用后,wrapper会先完成curses的初始化,保存当前terminal状态,调用func并将初始化屏幕句柄传入func作为其第一个参数,如有其他参数想传入,也可以作为调用wrapper的第二和第三个参数传入。我这里用不到,所以没有再加参数。
此外,wrapper入参支持类函数,因为类的函数默认第一个参数都是self,我还有点担心,但实测没有问题,照常使用即可。
import curses
class TestDisplay():
def __init__():
pass
def display(self,stdscr):
stdscr.clear()
stdscr.addstr(0,0,"hello world")
stdscr.refresh()
while 1:
pass
if __name__ == '__main__':
t = TestDisplay()
curses.wrapper(t.display)
有想深入学习和研究curses功能的,推荐看这个,好像是官方文档,python2和python3使用时区别不大,我的环境即为python2。