当前位置: 首页 > 科技观察

Python文本终端GUI框架,太酷了

时间:2023-03-16 14:37:34 科技观察

Curses第一个出现的是Curses[1]。CurseCurses是一个为基于文本的终端窗口提供功能的动态库。它可以:使用整个屏幕来创建和管理窗口使用8种不同的颜色为程序提供鼠标支持使用键盘上的功能键Curses可以在任何符合ANSI/POSIX标准的Unix/Linux系统上运行。Windows下也可以运行,但是需要额外安装windows-curses库:pipinstallwindows-curses可以复活古董机。我们也来试试:importcursesmyscreen=curses.initscr()myscreen.border(0)myscreen.addstr(12,25,"Pythoncursesinaction!")myscreen.refresh()myscreen.getch()curses.endwin()需要注意的是addstr的前两个参数是字符坐标,不是像素坐标。getch将阻塞程序,直到它等待键盘输入。curses.endwin()用于退出窗口。()获取的判断代码运行效果的输入如下:Curses非常轻量级,特别适合处理简单的交互,替换复杂的参数输入程序。它优雅简洁,Curses也是其他文本终端UI的基础。NpyscreenNpyscreen[3]也是一个编写文本终端的Python组件库,是一个基于Curses的应用框架。与Curses相比,Npyscreen更接近于UI风格的编程。通过组件组合完成UI显示和交互,Npyscreen可以适配屏幕变化。npyscreen提供了多种控件,如表单(Form)、单行文本输入框(TitleText)、日期控件(TitleDateCombo)、多行文本输入框(MultiLineEdit)、单选列表(TitleSelectOne)、进度条(TitleSlider)),等控制。提供强大的功能以满足快速程序开发的要求,无论是简单的单页程序还是复杂的多页应用程序。来看一个小例子:importnpyscreenclassTestApp(npyscreen.NPSApp):defmain(self):#这些行创建表单并用小部件填充它。#一个相当复杂的屏幕,只有8行左右的代码——每个控件一行。F=npyscreen.Form(name="欢迎使用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="""尝试在此处输入!\n多行文本,按^R重新格式化。\n""",max_height=5,rely=9)ms=F.add(npyscreen.TitleSelectOne,max_height=4,value=[1,],name="PickOne",values=["Option1","Option2","Option3"],scroll_exit=True)ms2=F.add(npyscreen.TitleMultiSelect,max_height=-2,value=[1,],name="PickSeveral",values=["Option1","Option2","Option3"],scroll_exit=True)#这让用户与表单交互。F.edit()print(ms.get_selected_objects())if__name__=="__main__":App=TestApp()App.run()引入npyscreen模块,如果没有可以通过pip安装:pipinstallnpyscreeninheritsnpyscreen.NPSApp创建一个应用类TestApp来实现main方法,在该方法中创建一个Form表单对象,然后在表单对象中添加各种控件,并设置控件的一些属性来调用表单对象的Edit方法,以及赋予用户操作权,实例化TestAPP,然后调用run方法启动应用,应用可以进入等待用户交互的状态。以上代码运行效果如下:npyscreen[Tab]/[Shift+Tab]用于切换控件焦点[Enter]/[Space]用于进入选择、设置、确认。在选择框中,方向键类似于vim[4]的操作,就是说通过hjkl来控制是不是很神奇?您可以对文本执行许多复杂的操作。命令前对行中进度显示的疑惑清楚了吗?Urwid如果说Curses和Npysreen是轻量级的文本终端UI框架,那么Urwid[5]绝对是重量级选手urwid包含很多开发文本UI的特性,例如:应用窗口自适应文本自动对齐轻松设置文本块强大的选择框控件可以与各种事件驱动框架集成,如Twisted[6]、Glib[7]、Tornado[8]等提供了编辑框、按钮、多(单)选框等多种预制控件。显示模式支持原生、Curses模式、LCD显示和网络显示。Chinese)supportsmultiplecolors查看效果:消息框有多种字体颜色。不知道你读的时候是什么感觉。我的感觉是:这太麻烦了~在GUI下几乎什么都能搞定!更何况,Urwid是一个完全基于面向对象思想的框架:提高urwid.ExitMainLoop()txt.set_text(repr(key))txt=urwid.Text(u"HelloWorld")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类似于面板,在上面填充txt控件,并设置位置在窗口的中央。按钮事件处理方法使用之前定义的show_or_exitloop.run()启动UI,监听各种事件。运行这段代码,可以看到命令行设置为交互模式,按下按钮时会显示在窗口中央。键名,如果按下q键,程序将退出。注意:urwid只能在Linux操作系统上运行,由于缺少必要的组件,无法在Windows上运行。还有一些优秀的框架,比如prompt_toolkit,有兴趣的同学可以研究一下。虽然基于文本终端的UI已经不再是主流,但在一些特殊的行业或业务中还是有其价值的。研究一下,说不定能在特殊的地方对我们有所帮助。最后推荐一款非常有趣的文本终端应用——命令行网易云音乐[9]:NetEase-MusicBox是基于Curses开发的。如果你运行它,你会被它的强大所震撼。心!