当前位置:首页 > 科技  > 软件

用Rust进行TUI编程:Cursive库

来源: 责编: 时间:2024-05-17 17:48:02 297观看
导读在本文中,我们将探索使用Rust进行文本用户界面(TUI)编程。TUI提供了一种通用的方法来创建具有丰富图形用户界面的交互式命令行应用程序。我们将使用Cursive库,一个流行的用于构建TUI应用程序的Rust库。Cursive使用声明

在本文中,我们将探索使用Rust进行文本用户界面(TUI)编程。TUI提供了一种通用的方法来创建具有丰富图形用户界面的交互式命令行应用程序。我们将使用Cursive库,一个流行的用于构建TUI应用程序的Rust库。Wju28资讯网——每日最新资讯28at.com

Cursive使用声明式UI:用户定义布局,然后Cursive处理事件循环。Cursive还处理大多数输入(包括鼠标点击),并将事件转发到当前聚焦的视图。用户代码更关注“事件”,而不是键盘输入。Wju28资讯网——每日最新资讯28at.com

它非常适合更复杂的应用程序,具有嵌套的视图树、菜单和弹出窗口。Wju28资讯网——每日最新资讯28at.com

图片图片Wju28资讯网——每日最新资讯28at.com

Wju28资讯网——每日最新资讯28at.com

创建项目

使用以下命令创建一个Rust新项目:Wju28资讯网——每日最新资讯28at.com

cargo new cursive_example

Wju28资讯网——每日最新资讯28at.com

然后,将Cursive添加到Cargo.toml文件中:Wju28资讯网——每日最新资讯28at.com

[dependencies]cursive = "0.20.0"

Wju28资讯网——每日最新资讯28at.com

Wju28资讯网——每日最新资讯28at.com

Cursive应用程序的基本结构Wju28资讯网——每日最新资讯28at.com

一个典型的Cursive应用程序主要包括三个阶段:Wju28资讯网——每日最新资讯28at.com

1,创建一个Cursive对象:我们从创建一个Cursive对象开始。cursive::default()方法可以帮助我们完成这项任务。Wju28资讯网——每日最新资讯28at.com

2,配置Cursive对象:在创建了Cursive对象之后,我们根据应用程序的需要对它进行配置。Wju28资讯网——每日最新资讯28at.com

3,执行Cursive Object:最后,我们运行Cursive对象来启动应用程序。Wju28资讯网——每日最新资讯28at.com

下面是一个最简单的Cursive应用:Wju28资讯网——每日最新资讯28at.com

fn main() {    // 创建一个Cursive对象    let mut siv = cursive::default();    // 执行Cursive对象    siv.run(); }

Wju28资讯网——每日最新资讯28at.com

运行这个程序,你会看到一个空白的应用程序窗口。Wju28资讯网——每日最新资讯28at.com

图片图片Wju28资讯网——每日最新资讯28at.com

Wju28资讯网——每日最新资讯28at.com

增加退出应用程序的方式

Cursive将用户输入作为事件处理,默认情况下,许多事件被忽略。为了允许用户通过按' q '退出应用程序,我们可以在根Cursive对象上使用add_global_callback方法:Wju28资讯网——每日最新资讯28at.com

siv.add_global_callback('q', |s| s.quit());

此代码片段添加了一个全局回调,该回调监听' q '键并在触发时退出应用程序。Wju28资讯网——每日最新资讯28at.com

Wju28资讯网——每日最新资讯28at.com

Wju28资讯网——每日最新资讯28at.com

Cursive视图

视图是Cursive应用程序中用户界面的核心构建块,它们定义在终端上显示的内容。视图可以是简单的元素,比如文本,也可以是复杂的小部件,比如复选框。Wju28资讯网——每日最新资讯28at.com

要显示文本消息,我们可以使用TextView::new("text")构造函数。最初,屏幕是空的,所以我们需要使用add_layer创建一个层。add_layer的参数应该是我们想要作为新图层显示的视图。Wju28资讯网——每日最新资讯28at.com

下面是一个显示“Hello TUI!”消息,并允许用户通过按' q '退出应用程序:Wju28资讯网——每日最新资讯28at.com

use cursive::views::TextView;fn main() {    // 创建一个Cursive对象    let mut siv = cursive::default();    // 添加一个全局回调,当按下'q'时退出应用程序    siv.add_global_callback('q', |s| s.quit());    // 添加一个TextView与我们的消息作为一个新的图层    siv.add_layer(TextView::new("Hello TUI! 按<q>退出."));    // 执行Cursive对象    siv.run(); }

Wju28资讯网——每日最新资讯28at.com

运行此程序将显示“Hello TUI!”,按<q>键退出。Wju28资讯网——每日最新资讯28at.com

图片Wju28资讯网——每日最新资讯28at.com

Wju28资讯网——每日最新资讯28at.com

对话框

对话框通常用于在TUI应用程序中创建交互式的和用户友好的基于文本的弹出窗口。它们允许你向用户呈现信息,并通过按钮和回调收集输入,从而增强用户体验。Wju28资讯网——每日最新资讯28at.com

让我们使用对话框,这是一个封装器,封装另一个视图,包括标题和选择按钮。而不是直接使用TextView。Wju28资讯网——每日最新资讯28at.com

Dialog::around函数直接接受一个视图,所以我们可以直接提供TextView:Wju28资讯网——每日最新资讯28at.com

siv.add_layer(Dialog::around(TextView::new("Question 1")));

Wju28资讯网——每日最新资讯28at.com

由于在文本视图中创建对话框窗口是一个常见的任务,dialog::text是一个可以直接完成此任务的函数,使我们的代码更短(并且我们不再需要导入cursive::views::TextView)。Wju28资讯网——每日最新资讯28at.com

siv.add_layer(Dialog::text("Empty"));

Wju28资讯网——每日最新资讯28at.com

我们可以使用Dialog::title方法添加标题。Wju28资讯网——每日最新资讯28at.com

use cursive::views::{TextView, Dialog};fn main() {    // 创建一个Cursive对象    let mut siv = cursive::default();    // 添加一个全局回调,当按下'q'时退出应用程序    siv.add_global_callback('q', |s| s.quit());    siv.add_layer(Dialog::text("did you do the thing?").title("This is the title"));    // 执行Cursive对象    siv.run(); }

Wju28资讯网——每日最新资讯28at.com

如果我们运行这段代码,我们将看到一个没有按钮的对话框窗口。Wju28资讯网——每日最新资讯28at.com

图片图片Wju28资讯网——每日最新资讯28at.com

Wju28资讯网——每日最新资讯28at.com

按钮

我们的对话框看起来比单独的TextView要好,但它仍然缺少一些动作。我们来添加一些按钮。Wju28资讯网——每日最新资讯28at.com

就像标题一样,Dialog有一个Dialog::button方法,用于添加带有关联动作的按钮。下面是如何使用Dialog::button添加按钮:Wju28资讯网——每日最新资讯28at.com

use cursive::views::{TextView, Dialog};fn main() {    // 创建一个Cursive对象    let mut siv = cursive::default();    siv.add_layer(Dialog::text("...").title("Did you do the thing?")        .button("Yes", |s| s.quit())          .button("No", |s| s.quit())        .button("Uh?", |s| s.quit()));    // 执行Cursive对象    siv.run(); }

Wju28资讯网——每日最新资讯28at.com

在这个例子中,对话框包括三个按钮:“是”、“否”和“Uh?”,当点击时,它们都有退出程序的动作。但是,你可以通过使用自定义函数替换“|s| s.quit()”来定制操作。Wju28资讯网——每日最新资讯28at.com

运行结果如下:Wju28资讯网——每日最新资讯28at.com

图片图片Wju28资讯网——每日最新资讯28at.com

让我们在一个更实际的背景下探讨这个问题:Wju28资讯网——每日最新资讯28at.com

use cursive::Cursive;use cursive::views::Dialog;fn main() {    let mut siv = cursive::default();    siv.add_layer(Dialog::text("This is a survey!/nPress <Next> when you're ready.")        .title("Important survey")        .button("Next", show_next));    siv.run();}fn show_next(_: &mut Cursive) {    // Leave this function empty for now}

Wju28资讯网——每日最新资讯28at.com

在这段代码中,在用户单击“Next”之后,我们希望隐藏当前对话框并显示一个新对话框。我们使用Cursive::pop_layer来移除当前图层。Wju28资讯网——每日最新资讯28at.com

为了更好地理解pop_layer是如何工作的,让我们分解这个过程:Wju28资讯网——每日最新资讯28at.com

use cursive::views::Dialog;use cursive::views::TextView;use cursive::Cursive;fn main() {    // 创建一个新的Cursive实例    let mut siv = cursive::default();    // 添加一个带有标题、文本和按钮的对话框图层。    siv.add_layer(        Dialog::text("Are you of legal age?")            .title("Question 1")            // 添加一个带有Yes回调函数的按钮            .button("Yes", yes)            // 添加一个带有回调No函数的按钮。            .button("No", no),    );    siv.run(); // Start the Cursive event loop.}fn yes(s: &mut Cursive) {    // 移除当前对话框层    s.pop_layer();    // 添加一个带有消息的TextView图层    s.add_layer(TextView::new("Good! You can proceed."));}fn no(s: &mut Cursive) {    // 移除当前对话框层    s.pop_layer();    // 添加一个带有消息的TextView图层    s.add_layer(TextView::new("You can't proceed!"));}

Wju28资讯网——每日最新资讯28at.com

正如你所看到的,Dialog视图是呈现TextView的一种很好的方式,但它也适用于任何其他内容。实际上,大多数的图层都是以一个包含其他视图的对话框开始。Wju28资讯网——每日最新资讯28at.com

Wju28资讯网——每日最新资讯28at.com

Wju28资讯网——每日最新资讯28at.com

总结

本文为使用Rust和Cursive库构建基于文本的用户界面(TUI)提供了坚实的起点。在此基础上,你可以浏览文档并深入研究更高级的TUI开发。Wju28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-88930-0.html用Rust进行TUI编程:Cursive库

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: JWT身份验证:.NET Core后台与Vue.js前端实现详解

下一篇: 精通Python单元测试:掌握Unittest模块的终极指南

标签:
  • 热门焦点
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
Top