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

用Rust进行TUI编程:Cursive库

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

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

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

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

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

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

创建项目

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

cargo new cursive_example

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

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

[dependencies]cursive = "0.20.0"

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

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

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

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

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

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

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

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

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

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

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

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

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

增加退出应用程序的方式

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

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

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

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

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

Cursive视图

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

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

下面是一个显示“Hello TUI!”消息,并允许用户通过按' q '退出应用程序:2t628资讯网——每日最新资讯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(); }

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

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

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

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

对话框

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

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

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

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

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

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

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

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

我们可以使用Dialog::title方法添加标题。2t628资讯网——每日最新资讯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(); }

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

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

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

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

按钮

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

就像标题一样,Dialog有一个Dialog::button方法,用于添加带有关联动作的按钮。下面是如何使用Dialog::button添加按钮:2t628资讯网——每日最新资讯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(); }

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

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

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

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

让我们在一个更实际的背景下探讨这个问题:2t628资讯网——每日最新资讯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}

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

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

为了更好地理解pop_layer是如何工作的,让我们分解这个过程:2t628资讯网——每日最新资讯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!"));}

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

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

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

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

总结

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

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

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

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

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

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 引领旗舰级影像能力向中端机普及 OPPO K11 系列发布 1799 元起

    7月25日,OPPO正式发布K系列新品—— OPPO K11 。此次 K11 在中端手机市场长期被忽视的影像板块发力,突破性地搭载索尼 IMX890 旗舰大底主摄,支持 OIS
  • 外交部:美方应停止在网络安全问题上不负责任地指责他国

      中国外交部今天(16日)举行例行记者会。会上,有记者问,美国情报官员称,他们正在阻拦来自中国以及其他国家的黑客获取相关科研成果。 中方对此有何评论?对此
Top