2021-05-21 python中curses基本用法

有时候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。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值