精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用Rust進行TUI編程:Cursive庫

開發 前端
本文為使用Rust和Cursive庫構建基于文本的用戶界面(TUI)提供了堅實的起點。在此基礎上,你可以瀏覽文檔并深入研究更高級的TUI開發。?

在本文中,我們將探索使用Rust進行文本用戶界面(TUI)編程。TUI提供了一種通用的方法來創建具有豐富圖形用戶界面的交互式命令行應用程序。我們將使用Cursive庫,一個流行的用于構建TUI應用程序的Rust庫。

Cursive使用聲明式UI:用戶定義布局,然后Cursive處理事件循環。Cursive還處理大多數輸入(包括鼠標點擊),并將事件轉發到當前聚焦的視圖。用戶代碼更關注“事件”,而不是鍵盤輸入。

它非常適合更復雜的應用程序,具有嵌套的視圖樹、菜單和彈出窗口。

圖片圖片

創建項目

使用以下命令創建一個Rust新項目:

cargo new cursive_example

然后,將Cursive添加到Cargo.toml文件中:

[dependencies]
cursive = "0.20.0"

Cursive應用程序的基本結構

一個典型的Cursive應用程序主要包括三個階段:

1,創建一個Cursive對象:我們從創建一個Cursive對象開始。cursive::default()方法可以幫助我們完成這項任務。

2,配置Cursive對象:在創建了Cursive對象之后,我們根據應用程序的需要對它進行配置。

3,執行Cursive Object:最后,我們運行Cursive對象來啟動應用程序。

下面是一個最簡單的Cursive應用:

fn main() {
    // 創建一個Cursive對象
    let mut siv = cursive::default();
    // 執行Cursive對象
    siv.run(); 
}

運行這個程序,你會看到一個空白的應用程序窗口。

圖片圖片

增加退出應用程序的方式

Cursive將用戶輸入作為事件處理,默認情況下,許多事件被忽略。為了允許用戶通過按' q '退出應用程序,我們可以在根Cursive對象上使用add_global_callback方法:

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

此代碼片段添加了一個全局回調,該回調監聽' q '鍵并在觸發時退出應用程序。

Cursive視圖

視圖是Cursive應用程序中用戶界面的核心構建塊,它們定義在終端上顯示的內容。視圖可以是簡單的元素,比如文本,也可以是復雜的小部件,比如復選框。

要顯示文本消息,我們可以使用TextView::new("text")構造函數。最初,屏幕是空的,所以我們需要使用add_layer創建一個層。add_layer的參數應該是我們想要作為新圖層顯示的視圖。

下面是一個顯示“Hello TUI!”消息,并允許用戶通過按' q '退出應用程序:

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(); 
}

運行此程序將顯示“Hello TUI!”,按<q>鍵退出。

圖片

對話框

對話框通常用于在TUI應用程序中創建交互式的和用戶友好的基于文本的彈出窗口。它們允許你向用戶呈現信息,并通過按鈕和回調收集輸入,從而增強用戶體驗。

讓我們使用對話框,這是一個封裝器,封裝另一個視圖,包括標題和選擇按鈕。而不是直接使用TextView。

Dialog::around函數直接接受一個視圖,所以我們可以直接提供TextView:

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

由于在文本視圖中創建對話框窗口是一個常見的任務,dialog::text是一個可以直接完成此任務的函數,使我們的代碼更短(并且我們不再需要導入cursive::views::TextView)。

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

我們可以使用Dialog::title方法添加標題。

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(); 
}

如果我們運行這段代碼,我們將看到一個沒有按鈕的對話框窗口。

圖片圖片

按鈕

我們的對話框看起來比單獨的TextView要好,但它仍然缺少一些動作。我們來添加一些按鈕。

就像標題一樣,Dialog有一個Dialog::button方法,用于添加帶有關聯動作的按鈕。下面是如何使用Dialog::button添加按鈕:

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(); 
}

在這個例子中,對話框包括三個按鈕:“是”、“否”和“Uh?”,當點擊時,它們都有退出程序的動作。但是,你可以通過使用自定義函數替換“|s| s.quit()”來定制操作。

運行結果如下:

圖片圖片

讓我們在一個更實際的背景下探討這個問題:

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
}

在這段代碼中,在用戶單擊“Next”之后,我們希望隱藏當前對話框并顯示一個新對話框。我們使用Cursive::pop_layer來移除當前圖層。

為了更好地理解pop_layer是如何工作的,讓我們分解這個過程:

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!"));
}

正如你所看到的,Dialog視圖是呈現TextView的一種很好的方式,但它也適用于任何其他內容。實際上,大多數的圖層都是以一個包含其他視圖的對話框開始。

總結

本文為使用Rust和Cursive庫構建基于文本的用戶界面(TUI)提供了堅實的起點。在此基礎上,你可以瀏覽文檔并深入研究更高級的TUI開發。

責任編輯:武曉燕 來源: coding到燈火闌珊
相關推薦

2010-10-27 10:19:33

UnicodeJava

2011-12-07 16:50:29

JavaNIO

2021-05-06 09:59:27

Rust惡意軟件網絡安全

2024-03-01 07:26:49

RustPolars機器學習

2023-06-19 14:14:24

Rust程序Web

2011-06-17 17:27:29

Objective-CCocoa蘋果

2021-03-23 14:50:16

編程語言Rust漏洞

2021-10-26 21:50:10

Rust嵌入式開發

2009-08-25 16:36:16

C#進行數據庫編程

2022-03-02 09:49:14

Rust編程語言

2024-01-09 09:27:57

Rust編程泛型

2024-01-07 17:29:10

編程語言線程Rust

2025-10-31 08:07:57

2023-05-23 18:31:14

Rust編程

2024-03-01 20:16:03

GoRust語言

2024-06-04 10:49:05

Rust插件開發工具

2009-12-30 15:55:20

ADO.NET數據庫

2024-06-12 08:00:07

2020-09-01 07:50:21

Rust 編程語言

2024-01-08 22:08:48

Rust生命周期編程
點贊
收藏

51CTO技術棧公眾號

99se婷婷在线视频观看| 亚洲精品.com| 国产精品第一| 丁香网亚洲国际| 中文字幕亚洲欧美日韩高清| 美女扒开大腿让男人桶| 免费看黄色aaaaaa 片| 国产原创视频在线观看| 精品国产乱码久久久久久蜜坠欲下 | 日韩国产综合| 精品欧美一区二区三区| 91日韩久久| 久久精品一区二区三区四区五区 | 亚洲欧美日韩免费| 欧美网站在线| 欧美一区二区视频网站| 亚洲国产成人不卡| 这里只有久久精品视频| 久久aimee| 一区二区三区四区在线| 成人疯狂猛交xxx| 永久免费观看片现看| 综合在线影院| 国产亚洲一区二区三区在线观看| 欧美一级片在线播放| 亚洲国产精品成人综合久久久| 色豆豆成人网| 精品久久久一区二区| 激情久久av| 免费黄色网址在线| 九九热爱视频精品视频| 日本丰满少妇一区二区三区| 欧美亚洲免费高清在线观看 | 欧美熟妇一区二区| 激情视频网站在线播放色| 成人亚洲一区二区一| 国产精品精品久久久久久| 成年人在线免费看片| 国产麻豆久久| 欧美视频在线观看免费网址| 久久久一本精品99久久精品66| 日韩 欧美 综合| 99精品国产一区二区三区2021| 一区二区高清在线| 国产在线资源一区| 久久久久在线视频| 久久大综合网| 在线电影av不卡网址| 五月天婷婷亚洲| 五月香视频在线观看| 狠狠色丁香婷婷综合久久片| 美女精品久久久| 亚洲激情 欧美| 欧美大片免费| 欧美网站在线观看| 国产一区二区三区精彩视频| 亚洲成人影院麻豆| 亚洲国产成人午夜在线一区| 2022国产精品| 国产美女永久免费| 中文日韩在线| www.欧美精品一二三区| 少妇精品无码一区二区| 我爱我色成人网| 激情懂色av一区av二区av| a在线视频观看| 在线观看av的网站| 中文字幕一区在线| 久久精品午夜一区二区福利| 六月婷婷综合网| 蜜桃传媒麻豆第一区在线观看| 欧美精品在线观看| 久久香蕉精品视频| 日韩欧美不卡| 精品国产一区二区三区久久久狼| 蜜桃av.com| 妖精视频一区二区三区| 欧美一级夜夜爽| 老司机av网站| 欧美美女在线直播| 91精品国产综合久久小美女| 哪个网站能看毛片| 国产理论电影在线| 国产精品国产三级国产三级人妇| 亚洲欧洲一二三| www红色一片_亚洲成a人片在线观看_| 国产亚洲女人久久久久毛片| 亚洲bbw性色大片| 香蕉视频免费在线看| 国产亚洲1区2区3区| 影音先锋欧美在线| 国产日韩精品在线看| 成人晚上爱看视频| 免费久久久一本精品久久区| 亚洲黄色精品视频| 国产中文一区二区三区| 国产精品久久av| 国产一区二区在线视频聊天| 日韩专区中文字幕一区二区| 91国产美女视频| 久久精品波多野结衣| 婷婷中文字幕一区| 日韩视频永久免费观看| 久久久久99精品| 国产精品magnet| 国产成人精品一区二区在线| 啦啦啦免费高清视频在线观看| 日本va欧美va精品| 欧美在线免费视频| 久久精品视频1| 国产美女一区二区| 日本婷婷久久久久久久久一区二区 | 日韩欧美视频免费观看| 亚洲天堂男人| 久久久久亚洲精品成人网小说| 日本少妇高清视频| 永久亚洲成a人片777777| 久久精品人人爽| 国产精品久久久久久成人| 欧美另类亚洲| 国产免费一区二区三区香蕉精| 中文字幕91爱爱| 成人午夜av在线| 欧美aaa在线观看| 中文字幕中文字幕在线中高清免费版 | 久久久久看片| 国产成人小视频在线观看| www.热久久| 国产mv日韩mv欧美| 北条麻妃高清一区| 性开放的欧美大片| 欧美在线视频日韩| 日韩成人精品视频在线观看| 国产精品99久久免费| 日韩欧美在线网站| 日本人dh亚洲人ⅹxx| 91亚洲无吗| 另类专区欧美制服同性| 精品一区在线视频| 国产精品中文字幕欧美| 国产精品久久精品国产 | 亚洲精品一区二区三区不| 女~淫辱の触手3d动漫| 亚洲高清成人| 日本精品免费观看| 亚洲一线在线观看| 国产.精品.日韩.另类.中文.在线.播放| 日韩视频精品| 中文在线观看免费| 欧美一区二区日韩一区二区| 国产馆在线观看| 美女视频黄 久久| 日韩三级电影| 欧美性www| 精品久久久久香蕉网| 中文字幕一区二区三区人妻不卡| 亚洲国产精品第一区二区三区 | 久久综合加勒比| 国产成人小视频| 久久久久久久久久码影片| 国产在线拍揄自揄拍视频| 日韩精品一区二| 国产在线一二区| 懂色av中文一区二区三区| 免费看欧美黑人毛片| 国产极品模特精品一二| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 亚洲男女自偷自拍图片另类| 国产小视频你懂的| 激情久久五月天| 成人免费在线视频播放| 亚洲爱爱视频| 日韩中文字幕在线| 国产chinasex对白videos麻豆| www久久精品| 国产精品av免费观看| 日本精品在线一区| 日韩在线观看高清| 亚洲第一视频在线播放| 精品免费在线视频| 日本一区二区视频在线播放| 免费在线成人网| 可以在线看黄的网站| 久久天堂av| 久久亚洲国产精品| 天堂中文在线观看视频| 亚洲人精品一区| www亚洲成人| 欧美精品第一区| 国产精品视频资源| 欧美日韩色网| 欧美一区二区三区免费| 99免费在线观看| 国产成人精品一区二区三区网站观看| 国产 日韩 亚洲 欧美| 亚洲国产欧美国产第一区| 最近2019中文字幕大全第二页| 女人十八岁毛片| 国产精品久久久久精k8| 色哟哟无码精品一区二区三区| 一区二区国产在线| 久久精品99| 中文字幕日本一区| xvideos成人免费中文版| 亚洲精品一区二区三区不卡| 色哟哟国产精品免费观看| 人妻在线日韩免费视频| 亚洲国产网站| 夜夜爽99久久国产综合精品女不卡 | 中文字幕日韩一区| 日韩av在线中文| 久久蜜桃av| 国产日韩欧美黄色| 日本中文字幕电影在线免费观看| 亚洲成人激情图| 日本一级黄色大片| 国产精品久久久久久妇女6080 | 亚洲系列另类av| 成人黄色在线免费观看| 日韩福利影视| 国产精品第三页| 性xxxxfreexxxxx欧美丶| 亚洲国产精久久久久久| 国产又粗又黄又爽的视频| 色婷婷综合久久久中文字幕| 久久高清无码视频| 中文字幕制服丝袜成人av| 成人黄色免费网址| 蜜臀精品一区二区三区在线观看| 欧美一区二区中文字幕| 综合久久亚洲| 特色特色大片在线| 国产伦精品一区二区三区免费优势| 国产女精品视频网站免费| 成人免费av电影| 国产98色在线| 欧美大胆性生话| 国产精品v片在线观看不卡| 亚洲女同志freevdieo| 午夜精品久久久久久久久久久久| 日av在线播放| 欧美人妇做爰xxxⅹ性高电影| 国产免费无码一区二区视频 | 国产精品xxxx| 欧美理论影院| 欧美在线欧美在线| 原纱央莉成人av片| 色婷婷综合久久久久| 黄色的视频在线免费观看| 91精品在线麻豆| 国产精品毛片一区二区在线看舒淇| 一区二区三区欧美久久| 国产成人久久久久| 亚洲黄色免费电影| 久草视频手机在线观看| 亚洲午夜电影在线观看| 亚洲一区二区自偷自拍| 久久久久久一二三区| 日本精品一区在线| 午夜亚洲伦理| 可以在线看黄的网站| 国内精品久久久久久久97牛牛| 欧美国产视频一区| 夜久久久久久| 热这里只有精品| 欧美福利视频| 无码免费一区二区三区免费播放 | 国产成人aaaa| 毛茸茸free性熟hd| 久久免费看少妇高潮| 亚洲一区二区三区四区精品| 国产麻豆91精品| 欧美夫妇交换xxx| 国产午夜精品久久久久久免费视 | 国产精品免费久久久久影院| 久久免费电影| 91成人性视频| 国产激情欧美| av成人在线电影| 香蕉视频一区| 国产嫩草一区二区三区在线观看| 任你弄精品视频免费观看| 日本一区二区高清视频| 97在线精品| av7777777| 久久精品国产亚洲aⅴ| 国产美女三级视频| 看国产成人h片视频| 国产人妖在线观看| 国产亚洲人成网站| 久久久久久久久久久久国产| 欧美色道久久88综合亚洲精品| 中文字幕人妻精品一区| 精品精品国产高清a毛片牛牛| 免费在线一级视频| 日韩成人中文字幕在线观看| 亚洲精品国偷拍自产在线观看蜜桃| 亚洲精品国产综合区久久久久久久| www.五月婷| 日韩精品视频三区| 永久免费av片在线观看全网站| 欧美精品videosex牲欧美| av免费网站在线| 日韩美女免费线视频| 日韩在线观看一区二区三区| 亚洲最大的av网站| 91精品网站在线观看| 精品日韩欧美| 欧美在线首页| 91人人澡人人爽人人精品| 成人av资源在线观看| 性感美女一区二区三区| 高清在线观看日韩| 69xxx免费| 日韩美女精品在线| 中文字幕国产在线观看| 精品久久人人做人人爰| 麻豆网站在线观看| 欧美巨猛xxxx猛交黑人97人| 影院在线观看全集免费观看| 国产精品999999| 色88888久久久久久影院| 老司机激情视频| 麻豆久久一区二区| 性高潮久久久久久久| 午夜精品久久久久久| 日韩在线视频不卡| 亚洲国产欧美一区| 男插女视频久久久| 91在线视频成人| 波多野结衣一区二区三区免费视频| 一本一本a久久| 免费美女久久99| 天堂在线中文视频| 日本道免费精品一区二区三区| 午夜成人免费影院| 久久久久久久香蕉网| 日韩欧美激情电影| 欧美 日韩 国产精品| 国产主播一区二区三区| 久久高清内射无套| 亚洲va在线va天堂| 丰满人妻妇伦又伦精品国产| 欧美精品日韩www.p站| 精品伊人久久| 蜜桃91精品入口| 一区二区日韩免费看| 亚洲男女在线观看| 午夜日韩在线观看| 乱色精品无码一区二区国产盗| 欧美激情高清视频| 精品123区| 亚洲欧洲日韩综合二区| 久久99热国产| 亚洲精品乱码久久久久久久| 欧美日韩精品在线播放| 日本一二三区在线视频| 日本精品性网站在线观看| 在线一级成人| 免费涩涩18网站入口| 国产精品久久久久久久浪潮网站| 一本色道久久综合精品婷婷 | 俄罗斯毛片基地| 欧美日本韩国一区二区三区视频 | 亚洲免费观看高清完整版在线 | 国产精品一区二区三区免费| 亚洲私人影院| 亚洲永久精品ww.7491进入| 中文字幕一区二区三区在线观看| 国产精品久久无码一三区| 欧美成人全部免费| 久久中文字幕导航| 欧美两根一起进3p做受视频| 懂色av中文字幕一区二区三区| 久草手机在线观看| 国产一区二区三区三区在线观看| 大香伊人中文字幕精品| 久久国产精品高清| 男女性色大片免费观看一区二区| 老湿机69福利| 亚洲精品国产综合区久久久久久久 | 色哟哟在线观看视频| 五月天国产精品| eeuss影院www在线播放| 97精品视频在线| 国产一区二区三区天码| 伊人成色综合网| 欧美国产激情一区二区三区蜜月 | 国产一区在线视频| 日本在线视频免费| 日韩在线精品视频| 老司机凹凸av亚洲导航| 黄色片视频在线| 亚洲图片欧美一区| 777电影在线观看| 国产成人精彩在线视频九色| 婷婷精品进入| 国产精品无码久久久久一区二区| 欧美精品黑人性xxxx| 日韩三级影院|