Python文本终端GUI框架详解

今天笔者带大家,梳理几个常见的基于文本终端的 UI 框架,一睹为快!

Curses

首先出场的是 Curses。

Curses 是一个能提供基于文本终端窗口功能的动态库,它可以:

  • 使用整个屏幕

  • 创建和管理一个窗口

  • 使用 8 种不同的彩色

  • 为程序提供鼠标支持

  • 使用键盘上的功能键

Curses 可以在任何遵循 ANSI/POSIX 标准的 Unix/Linux 系统上运行。Windows 上也可以运行,不过需要额外安装 windows-curses 库:

pip install windows-curses

上面图片,就是一哥们用 Curses 写的 俄罗斯方块游戏,是不感觉满满的回忆吧,可以拿去复活古董机了。

我们也来试试牛刀:

import cursesmyscreen = curses.initscr()myscreen.border(0)
myscreen.addstr(12, 25, "Python curses in action!")
myscreen.refresh()
myscreen.getch()curses.endwin()
  • 需要注意 addstr 前两个参数是字符坐标,不是像素坐标

  • getch 会阻塞程序,直到等待键盘输入

  • curses.endwin() 作用是退出窗口

  • 如果需要持续监听用户的交互,需要写个循环,并对 getch() 获得的输入进行判断

代码运行效果如下:

 Curses 非常轻巧,特别适合处理一下简单交互,代替复杂参数输入的程序,既优雅,有简单,而且 Curses 也是其他文字终端 UI 的基础。Npyscreen

Npyscreen

也是一个用了编写文本终端的 Python 组件库,是基于 Curses 构建的应用框架。

比起 Curses,Npyscreen 更接近 UI 式编程,通过组件的组合完成 UI 展示和交互,而且 Npyscreen 可以自适应屏幕变化。

Npyscreen 提供了多个控件,比如 表单(Form)、单行文本输入框(TitleText)、日期控件(TitleDateCombo)、多行文本输入框(MultiLineEdit)、单选列表(TitleSelectOne)、进度条(TitleSlider)等多种控件。

提供强大的功能,满足快速开发程序的要求,无论是简单的单页程序还是复杂的多页应用。

来看一个小例子:

import npyscreenclass TestApp(npyscreen.NPSApp):def main(self):# These lines create the form and populate it with widgets.# A fairly complex screen in only 8 or so lines of code - a line for each control.F  = npyscreen.Form(name = "Welcome to Npyscreen",)t  = F.add(npyscreen.TitleText, name = "Text:",)fn = F.add(npyscreen.TitleFilename, name = "Filename:")fn2 = F.add(npyscreen.TitleFilenameCombo, name="Filename2:")dt = F.add(npyscreen.TitleDateCombo, name = "Date:")s  = F.add(npyscreen.TitleSlider, out_of=12, name = "Slider")ml = F.add(npyscreen.MultiLineEdit,value = """try typing here!\nMutiline text, press ^R to reformat.\n""",max_height=5, rely=9)ms = F.add(npyscreen.TitleSelectOne, max_height=4, value = [1,], name="Pick One",values = ["Option1","Option2","Option3"], scroll_exit=True)ms2= F.add(npyscreen.TitleMultiSelect, max_height =-2, value = [1,], name="Pick Several",values = ["Option1","Option2","Option3"], scroll_exit=True)# This lets the user interact with the Form.F.edit()print(ms.get_selected_objects())if __name__ == "__main__":App = TestApp()App.run()
  • 引入 Npyscreen 模块,如果没有可以通过 pip 安装:pip install npyscreen

  • 继承 npyscreen.NPSApp 创建一个应用类 TestApp

  • 实现 main 方法,方法里创建一个 Form 表单对象,然后向表单对象上添加各种控件,并设置控件的一些属性

  • 调用表单对象的 Edit 方法,将操作权交给用户

  • 在运行时,实例化 TestAPP,然后调用 run 方法启动应用,应用即可进入等待用户交互的状态

上面代码运行的效果如下:

  • [Tab] / [Shift + Tab] 用于切换控件焦点

  • [回车] / [空格] 用于进入选择、设置、确认

  • 在选择框架中,方向键与 vim[4] 操作类似,即通过 hjkl 来控制

是不是感觉很神奇,用文本原来可以做这么多复杂的操作,之前对命令行中的进度显示的疑惑是否有所清晰了 ~

Urwid

如果说 Curses 和 Npysreen 是轻量级的文本终端 UI 框架,那么 Urwid 绝对称得上是重量级选手。

Urwid 包含了众多开发文本 UI 的特性,例如:

  • 应用窗口自适应

  • 文本自动对齐

  • 轻松设置文本块

  • 强大的选择框控件

  • 可以和各种基于事件驱动的框架集成,比如和 Twisted, Glib, Tornado等等

  • 提供诸如编辑框、按钮、多(单)选框 等多种预制控件

  • 显示模式支持原生、Curses模式、LCD 显示屏 以及 网络显示器

  • 支持 UTF-8 以及 CJK 字符集(可以显示中文)

  • 支持多种颜色

看看效果:

 不知道你看了是什么感觉,我的感觉是:这也太卷了吧~几乎可以做 GUI 下的所有事情!更厉害的是,Urwid 完全是按照面向对象的思想打造的框架:

 现在我们来小试一把,感受一下 Urwid 的强大:

import urwiddef show_or_exit(key):if key in ('q', 'Q'):raise urwid.ExitMainLoop()txt.set_text(repr(key))txt = urwid.Text(u"Hello World")
fill = urwid.Filler(txt, 'middle')
loop = urwid.MainLoop(fill, unhandled_input=show_or_exit)
loop.run()
  • 先引入 urwid 模块

  • 定义了一个输入事件处理方法 show_or_exit

  • 处理方法中,当输入按键是 q 或者 Q 时,退出主循环,否则将按键名称显示出来

  • urwid.Text 是一个文本控件,接受一个字符串作为显示信息

  • urwid.Filler 类似于 panel,将 txt 控件填充在上面,位置设置在窗口中央

  • urwid.MainLoop 设置 Urwid 的主循环,将 fill 作为控件的绘制入口,参数 unhandled_input 接受一个按键事件处理方法,用的就是前面定义的 show_or_exit

  • loop.run() 启动 UI,并监控各种事件

运行这段代码,就可以看到命令行被设置为交互模式,按键时会在窗口中央显示出键名,如果按下 q 键,程序就会退出。

注意:Urwid 只能在 Linux 操作系统中运行,Windows 上会因为缺失必要组件无法运行

总结

限于篇幅,这里只展示了三种文本终端框架,不过已经能对基于文本终端 UI 框架的强大感受一二了。

还有一些框架也很优秀,比如 prompt_toolkit,有兴趣的同学可以研究一下。

虽然基于文本终端的 UI 早已不是主流,但是在一些特殊的行业或者业务中,还是有其存在的价值,研究一下,说不定在特殊的地方可以帮助到我们。

---END---

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/112638.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用最少数量的箭引爆气球【贪心算法】

用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地…

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【六】

😀前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【六】,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章…

iOS逆向:越狱及相关概念的介绍

在上一篇内容中我们介绍了App脱壳的技术,今天我们来介绍一个和iOS逆向密切相关的知识:越狱。 iOS操作系统的封闭性一直是开发者们关注的焦点之一。为了突破Apple的限制,越狱技术应运而生。本文将深入探讨iOS越狱,包括可越狱的版本…

MongoDB 双机热备那篇文章是 “毒”

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis ,Oracle ,Oceanbase 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加微信号 liuaustin3 (…

成功对接巴斯夫BASF EDI 平台

BASF,作为中国化工领域重要的外商投资企业,巴斯夫主要的投资项目位于南京、上海和重庆,生产基地遍布全国,其中巴斯夫上海创新园更是全球的研发枢纽。2017年,巴斯夫大中华区销售额达到73亿欧元(按客户所在地…

Java“牵手”1688拍立淘接口数据,图片搜索1688商品,图片识别商品接口,1688API申请指南

1688商城是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取1688商品列表和商品详情页面数据,您可以通过开放平台的接口或者直接访问1688商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…

Linux————LNMT搭建

一、原理 搭建一个基于Linux系统的Web服务器,使用Nginx作为反向代理服务器,Tomcat作为应用服务器,MySQL作为数据库服务器。 Linux操作系统 基于Linux的操作系统 Nginx Nginx是一款高性能的Web服务器和反向代理服务器&#xff0…

Java自定义捕获异常

需求分析 ElectricalCustomerVO electricalCustomerVO new ElectricalCustomerVO(); electricalCustomerVO.setElcNumber(chatRecordsLog.getDeviceNumber()); List<ElectricalCustomerVO> electricalCustomerlist electricalCustomerMapper.selectElectricalCustomer…

读SQL学习指南(第3版)笔记06_连接和集合

1. 连接 1.1. 笛卡儿积 1.1.1. 交叉连接&#xff08;cross join&#xff09; 1.1.2. 查询并没有指定两个数据表应该如何连接&#xff0c;数据库服务器就生成了笛卡儿积 1.1.2.1. 两个数据表的所有排列组合 1.1.3. 很少会用到&#xff08;至少不会特意用到&#xff09; 1.…

政府科技项目验收全流程分享

科技验收测试 &#xff08;验收申请→主管部门初审→科技厅审核→组织验收→归档备案→信用管理&#xff09;&#xff1a; &#xff08;一&#xff09;验收申请 项目承担单位通过省科技业务管理系统提交验收申请。 按期完成的项目&#xff0c;项目承担单位应当在项目合同书…

自测scRNA-Seq+scWGBS=3分三区文章?

写在前面 最近在捣鼓表观遗传学&#xff0c;处理了一批Bulk RNA-Seq和WGBS(Whole Genome Bisulfite Sequencing)的数据。熟悉我风格的粉丝都知道&#xff0c;我一般会读几篇文献再下手&#xff0c;遂于PubMed中检索了几篇文章&#xff0c;发现一个2022年发表的题为"WGBS …

为什么JVM调优一般都是针对堆内存的,以及堆内存的设置对GC的影响

1、为什么JVM调优一般都是针对堆内存的&#xff1f; 首先JVM的四部分组成&#xff1a;ClassLoader&#xff08;类装载器&#xff09;、Runtime data area 运行数据区、Execution Engine 执行引擎、Native Interface 本地接口。 其中运行数据区&#xff08;Runtime Data Area&am…

python-数据可视化-下载数据-CSV文件格式

数据以两种常见格式存储&#xff1a;CSV和JSON CSV文件格式 comma-separated values import csv filename sitka_weather_07-2018_simple.csv with open(filename) as f:reader csv.reader(f)header_row next(reader)print(header_row) # [USW00025333, SITKA AIRPORT, A…

零知识证明(zk-SNARK)(一)

全称为 Zero-Knowledge Succinct Non-Interactive Argument of Knowledge&#xff0c;简洁非交互式零知识证明&#xff0c;简洁性使得运行该协议时&#xff0c;即便statement非常大&#xff0c;它的proof大小也仅有几百个bytes&#xff0c;并且验证一个proof的时间可以达到毫秒…

C++进阶之继承

继承 继承的概念及定义基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员复杂的菱形继承及菱形虚拟继承继承的总结和反思 继承的概念及定义 在C中&#xff0c;继承是一种面向对象编程的重要概念&#xff0c;它允许一个类&#xff08;称为子…

java-初识Servlet,Tomcat,JDBC

文章目录 前言一、ServletServlet 生命周期Servlet 实例Servlet 过滤器 二、TomcatJDBCJDBC连接数据库实例 总结 前言 java入门须知的重要概念/名词/技术 等 一、Servlet Servlet是Java Web开发中的一个核心组件&#xff0c;它是基于Java语言编写的服务器端程序&#xff0c;…

火热的大模型AIGC对数据中心存储趋势有什么影响?

随着人工智能和大数据技术的不断发展&#xff0c;业内AIGC&#xff08;人工智能、图形处理和云计算&#xff09;和大模型的发展趋势正在对数据中心存储发展方向产生深远的影响&#xff0c;主要集中对数据量和高性能计算的诉求。 大模型的普及要求数据中心存储具备更大的容量。大…

基于Googlenet深度学习网络的螺丝瑕疵检测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ....................................................................................% 获…

踏进字节的那一瞬间,我泪目了,这457天的外包经历值了....

一年半吗&#xff1f;我只记得437个日日夜夜 没有绝对的天才&#xff0c;只有持续不断的付出。对于我们每一个平凡人来说&#xff0c;改变命运只能依靠努力幸运&#xff0c;但如果你不够幸运&#xff0c;那就只能拉高努力的占比。 2021年8月&#xff0c;我有幸成为了字节跳动…

C语言面向对象的编程思想

面向对象编程 面向对象编程Object-Oriented Programming&#xff0c;OOP&#xff09; 作为一种新方法&#xff0c;其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征&#xff0…