>  기사  >  백엔드 개발  >  Python 텍스트 터미널 GUI 프레임워크, 정말 멋지네요.

Python 텍스트 터미널 GUI 프레임워크, 정말 멋지네요.

王林
王林앞으로
2023-04-12 12:52:081367검색

Curses

가장 먼저 등장하는 것은 Curses[1]입니다.

Python 텍스트 터미널 GUI 프레임워크, 정말 멋지네요.

Curse

Curses는 다음을 수행할 수 있는 텍스트 기반 터미널 창 기능을 제공하는 동적 라이브러리입니다.

  • 전체 화면 사용
  • 창 생성 및 관리
  • 프로그램에 8가지 색상 사용
  • 제공 마우스 지원
  • 키보드의 기능 키 사용

Curses는 ANSI/POSIX 표준을 따르는 모든 Unix/Linux 시스템에서 실행될 수 있습니다. Windows에서도 실행할 수 있지만 windows-curses 라이브러리를 추가로 설치해야 합니다.

pip install windows-curses

위 그림은 친구가 Curses[2]를 사용하여 작성한 테트리스 게임입니다. 골동품 기계를 부활시키는 데 사용됩니다.

새로운 것을 시도해 봅시다:

import curses
myscreen = curses.initscr()
myscreen.border(0)
myscreen.addstr(12, 25, "Python curses in action!")
myscreen.refresh()
myscreen.getch()
curses.endwin()
  • addstr의 처음 두 매개 변수는 픽셀 좌표가 아니라 문자 좌표입니다.
  • getch는 키보드 입력을 기다릴 때까지 프로그램을 차단합니다.
  • curses.endwin()을 사용하여 종료합니다.
  • 사용자 상호 작용을 지속적으로 모니터링해야 하는 경우 루프를 작성하고 getch()에서 얻은 입력을 판단해야 합니다.

코드 실행 효과는 다음과 같습니다.

Python 텍스트 터미널 GUI 프레임워크, 정말 멋지네요.

작은 테스트

Curses는 매우 가볍고 처리에 특히 적합합니다. 복잡한 매개변수 입력을 대체하는 프로그램인 Simple Interaction은 우아하면서도 단순하며, Curses는 다른 텍스트 터미널 UI의 기반이기도 합니다.

Npyscreen

Npyscreen[3]은 텍스트 터미널 작성을 위한 Python 구성 요소 라이브러리이기도 하며 Curses를 기반으로 구축된 애플리케이션 프레임워크입니다.

Curses에 비해 Npyscreen은 UI 프로그래밍에 더 가깝습니다. UI 표시 및 상호 작용은 구성 요소의 조합을 통해 완료되며 Npyscreen은 화면 변경에 적응할 수 있습니다.

Npyscreen은 양식(Form), 한 줄 텍스트 입력 상자(TitleText), 날짜 컨트롤(TitleDateCombo), 여러 줄 텍스트 입력 상자(MultiLineEdit), 단일 선택 목록(TitleSelectOne) 및 진행과 같은 다중 컨트롤을 제공합니다. 바(TitleSlider) 및 기타 여러 컨트롤.

간단한 단일 페이지 프로그램이든 복잡한 다중 페이지 애플리케이션이든 신속한 프로그램 개발 요구 사항을 충족하는 강력한 기능을 제공합니다.

작은 예를 살펴보겠습니다.

import npyscreen
class 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 애플리케이션 클래스를 생성합니다
  • 메소드를 작성하고 메소드에서 Form 양식 객체를 생성한 다음 양식 객체에 다양한 컨트롤을 추가하고 컨트롤의 일부 속성을 설정하세요
  • 양식 객체의 Edit 메소드를 호출하고 사용자에게 작업 권한을 넘겨주세요
  • 런타임에, TestAPP를 인스턴스화한 후 실행 메소드를 호출하여 애플리케이션을 시작합니다. 사용자 상호작용을 기다리는 상태로 들어갈 수 있습니다

위 코드를 실행했을 때의 효과는 다음과 같습니다.

Python 텍스트 터미널 GUI 프레임워크, 정말 멋지네요.

Npyscreen

  • [탭] / [Shift + Tab]은 제어 초점을 전환하는 데 사용됩니다
  • [Enter] / [Space ] 선택, 설정, 확인을 입력하는 데 사용됩니다.
  • 선택 프레임에서 방향 키는 vim[4] 작업과 유사합니다. hjkl을 통해 제어됩니다

텍스트로 너무 많은 복잡한 작업을 수행할 수 있다는 사실이 놀랍지 않나요? 명령줄의 진행률 표시에 대한 이전 의심이 명확해졌습니다~

Urwid

Curses 및 Npysreen 경량 텍스트 터미널 UI 프레임워크라면 Urwid[5]는 확실히 헤비급 플레이어라고 부를 수 있습니다.

Urwid에는 다음과 같은 텍스트 UI 개발을 위한 많은 기능이 포함되어 있습니다.

  • 응용 프로그램 창 적응
  • 자동 텍스트 정렬
  • 쉽게 텍스트 블록 설정
  • 강력한 선택 상자 제어
  • 다양한 이벤트 기반 프레임워크와 통합 가능 통합, Twisted[6], Glib[7], Tornado[8] 등
  • 편집 상자, 버튼, 다중(단일) 선택 상자 등과 같은 다양한 사전 제작된 컨트롤을 제공합니다.
  • 디스플레이 모드는 기본 지원 , 저주 모드, LCD 디스플레이 및 네트워크 디스플레이
  • UTF-8 및 CJK 문자 집합 지원(중국어 표시 가능)
  • 다양한 색상 지원

효과 보기:

Python 텍스트 터미널 GUI 프레임워크, 정말 멋지네요.

메시지 상자

Python 텍스트 터미널 GUI 프레임워크, 정말 멋지네요.

다중 글꼴

Python 텍스트 터미널 GUI 프레임워크, 정말 멋지네요.

色彩

不知道你看了是什么感觉,我的感觉是:这也太卷了吧~

几乎可以做 GUI 下的所有事情!

更厉害的是,Urwid 完全是按照面向对象的思想打造的框架:

Python 텍스트 터미널 GUI 프레임워크, 정말 멋지네요.

Urwid 结构图

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

import urwid
def 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 早已不是主流,但是在一些特殊的行业或者业务中,还是有其存在的价值,研究一下,说不定在特殊的地方可以帮助到我们。

最后,推荐一个很有意思的基于文本终端的应用 —— 命令行网易云音乐[9]:

Python 텍스트 터미널 GUI 프레임워크, 정말 멋지네요.

NetEase-MusicBox

是基于 Curses 开发,如果运行起来,能被它的强悍所震撼,有空可以玩玩,比心!

위 내용은 Python 텍스트 터미널 GUI 프레임워크, 정말 멋지네요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제