之前的文章<<TUI库newt和snack简要介绍>>介绍了如何使用newt库开发控制台应用程序。newt库是一个非常简单的库,只适合开发逻辑为顺序流程的程序,比如,典型的程序安装向导。当程序逻辑较为复杂时,可以直接使用ncurses来实现。但ncurses是一个较为底层的库,使用它开发工作量会较大。本文介绍一个使用更为简易但可实现复杂功能的TUI库:npyscreen。
当前最新版本为4.10.5,如图:
 
Npyscreen应用由三种对象构成:
- Application对象:负责应用程序的开始、结束,创建- Form对象,处理事件, 主要有两种类型:- NPSAppManaged: 该类提供了开始和结束应用的框架,管理各类Form对象的显示,不需要自己完成该程序的主循环逻辑。
- NPSApp:该类的实例需要在.main()中提供自定义的主循环逻辑,该类实例执行.run()时,该主循环逻辑会被执行。不推荐直接使用该类。
 
- Form对象:表示包含- Widget对象的屏幕区域,主要有以下类型:- FormBaseNew: 空Form
- Form: 带有- <<OK>>按钮的Form
- ActionForm: 带有- <<OK>>和- <<Cancel>>两个按钮的Form
- FormWithMenus: 支持Menu组件的Form
 
- Widget对象:表示各种与用户交互的组件
具体细节,可以参考官网文档
Npyscreen更推荐使用面向对象的编程方法,继承库中的类来自定义所需要的类,通过覆盖默认方法来扩展应用程序需要的功能。
下面我们依然实现上篇文章中的登录示例来说明npyscreen的简要用法。
首先直接使用PIP安装npyscreen:
| 1 | pip install npyscreen | 
我们的程序由两个FORM构成,第一个FORM用于使用者输入用户名和密码,如下图:
 
当用户名和密码输入正确时,显示第二个FORM, 它用于显示登录成功的消息,如图:
 
程序源代码如下:
| 1 | import npyscreen | 
首先,我们创建了一个SuccessForm类,它继承npyscreen.Form类, 它自带一个<<OK>>按钮。它用于显示登录成功消息。create方法用于初始化该Form, 我们在其中创建了一个FixedText用于显示登录消息。术语Edit表示Form与用户的交互。方法beforeEditing在进入Form自身的Edit循环前调用,而afterEditing在交互完成Form要退出时被调用。我们在beforeEditing方法中将要显示的内容准备好。在afterEditing中通过调用NPSAppManaged.switchForm(None)退出程序。
另一个类LoginForm表示用户输入用户名和密码的Form。它继承npyscreen.ActionForm, 带有一个<<OK>>和<<Cancel>>按钮。create方法用于初始化该Form, 创建了两个输入框来接收用户输入。beforeEditing方法用于在显示前清空内容。on_ok和on_cancel方法分别处理<<OK>>按钮和<<Cancel>>按钮被触发后的逻辑。<<OK>>按钮触发后,我们获取并检查用户输入的内容。若输入的用户名和密码正确,则调用NPSAppManaged.switchForm(’SUCCESSFORM’)显示第二个FORM。当<<Cancel>>按钮触发时,退出应用程序。
LoginApp类表示整个应用,在onStart方法中,我们添加了以上两个FORM,默认显示名称为MAIN的FORM。
最后直接调用NPSAppManaged.run()方法开始该程序。
整体用法上非常简单,实现多屏应用及菜单等较为复杂的功能也不困难。只是官方文档上对于很多类及方法的描述并不是很详细,很多使用细节往往需要去翻阅源码,具体的一些示例可以参考:
https://github.com/vtr0n/npyscreen
这个GITHUB作者还实现了一个基于npyscreen的Telegram客户端,如图:
 
是一个非常好的复杂应用的参考示例,具体代码参考: https://github.com/vtr0n/TelegramTUI