精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美激情中文网| 欧美久久婷婷综合色| 欧美日韩亚洲一区二区三区在线观看 | 欧美黄色性视频| 3d动漫精品啪啪一区二区下载 | 国产高清一区二区三区| 亚洲熟妇无码乱子av电影| 99久久综合狠狠综合久久aⅴ| 日韩精品一区二区三区中文不卡| 日本在线视频www| av免费在线观看网址| 久久综合久久综合九色| 亚洲自拍欧美另类| 亚洲精品国产欧美在线观看| 欧美精品麻豆| 日韩在线观看免费网站| 中文字幕 亚洲一区| 不卡一区视频| 欧美羞羞免费网站| 欧美在线观看www| 搞黄网站在线观看| 欧美国产日产图区| 久久99精品久久久久久久久久| 亚洲天天综合网| 亚洲专区一区二区三区| 久精品免费视频| 精品国产大片大片大片| 久久99久久人婷婷精品综合| 欧美成人a∨高清免费观看| 在线观看的毛片| 三妻四妾的电影电视剧在线观看| 亚洲免费视频中文字幕| 亚洲精品一品区二品区三品区| 午夜福利一区二区三区| 国产不卡视频一区二区三区| 成人亚洲欧美一区二区三区| 国产成人av免费| 丝袜美腿亚洲色图| 日本一本a高清免费不卡| 亚洲国产精一区二区三区性色| 亚洲无中文字幕| 精品国产依人香蕉在线精品| 欧美黄色高清视频| 成人情趣视频网站| 自拍偷拍亚洲区| 国产午夜精品久久久久久久久| 综合国产视频| 亚洲欧洲午夜一线一品| 免费看黄色aaaaaa 片| 香蕉久久99| 精品视频久久久久久久| 永久免费看mv网站入口78| 欧洲vs亚洲vs国产| 日韩精品中文字幕在线播放| 亚洲狠狠婷婷综合久久久久图片| 日韩三区视频| 亚洲人成五月天| 免费看黄色三级| 日韩精品免费| 美女精品久久久| 久久久久久久久久91| 国产一区日韩一区| 性欧美xxxx视频在线观看| a v视频在线观看| 日韩精品三区四区| 国产精品中文字幕在线| 一区二区三区播放| 国产福利一区二区三区视频在线| yy111111少妇影院日韩夜片| 欧美自拍偷拍一区二区| 26uuu国产日韩综合| 欧美自拍资源在线| 91在线不卡| 亚洲女同一区二区| 国产精品久久久久久久乖乖| 在线手机中文字幕| 欧美亚洲国产一区在线观看网站| 在线观看国产福利| 91夜夜蜜桃臀一区二区三区| 亚洲精品久久久久久下一站| 男人天堂av电影| 99久久99视频只有精品| 欧美激情aaaa| 香蕉影院在线观看| 激情文学综合插| 精品国产一二| 毛片免费不卡| 天天综合色天天综合色h| 少妇性l交大片| 视频精品国内| 国产一区二区三区在线| 欧美成人黄色网| 日精品一区二区| 亚洲综合大片69999| 日本中文字幕一区二区有码在线| 136国产福利精品导航| 国产资源在线视频| 96视频在线观看欧美| 亚洲精品久久久久| 波多野结衣亚洲一区二区| 国产视频欧美| 5566av亚洲| 福利视频在线看| 亚洲成av人片在www色猫咪| 黑森林精品导航| 精品三级av| xxx一区二区| 黄色片视频免费| 高清不卡一二三区| www亚洲国产| 婷婷六月国产精品久久不卡| 欧美成人精品3d动漫h| 婷婷色一区二区三区| 亚洲国产日本| 亚洲一区二区三区四区视频| 伦理片一区二区三区| 亚洲一区二区三区三| 老司机久久精品| 欧美伦理在线视频| 欧美壮男野外gaytube| 成人1区2区3区| 中文字幕综合网| 亚洲色图 在线视频| 亚洲va久久久噜噜噜久久| 欧美高清激情视频| 国产免费黄色录像| 一区在线播放视频| 一道本在线免费视频| 九色精品国产蝌蚪| 26uuu亚洲国产精品| www.蜜桃av.com| 亚洲欧美国产77777| 精品亚洲视频在线| 久久综合88| 国产欧美日韩91| 成人一区二区不卡免费| 一本大道综合伊人精品热热| 三叶草欧洲码在线| 中文字幕在线播放av| 午夜亚洲伦理| 日韩电影毛片| 在线不卡中文字幕| 999福利视频| 久久精品免费观看| 亚洲毛片aa| 欧美天堂一区| www.国产一区| 一级黄色片在线看| 亚洲欧洲av色图| 欧美一级xxxx| 欧美aa国产视频| 99re在线观看| rebdb初裸写真在线观看| 亚洲成人av在线播放| 久久精品国产亚洲av无码娇色| 国产麻豆视频精品| 嫩草影院中文字幕| а√中文在线天堂精品| 久久久久女教师免费一区| 少妇高潮一区二区三区69| 亚洲成av人综合在线观看| avtt香蕉久久| 日韩成人免费看| 综合久久国产| 国产一区丝袜| 国产成人免费av| 日本暖暖在线视频| 日韩欧美专区在线| 91午夜视频在线观看| 91蜜桃在线免费视频| 爱情岛论坛成人| 一区二区三区国产精华| 国产成人精品福利一区二区三区 | 国语自产在线不卡| 色中色在线视频| 欧美性猛交xxxx乱大交退制版| 亚洲精品天堂网| 国产电影一区在线| 国产91对白刺激露脸在线观看| 教室别恋欧美无删减版| 成人久久一区二区| 17videosex性欧美| 影音先锋日韩有码| 国产成人免费看一级大黄| 精品久久久久久久久久久久久| 欧美多人猛交狂配| 狠狠色狠狠色合久久伊人| 欧美成人三级在线视频| 精品一区二区三| 亚洲一区国产精品| 另类专区亚洲| 欧美激情国产日韩精品一区18| 欧美精品a∨在线观看不卡| 欧美精品一二三四| 中文字幕69页| 亚洲最快最全在线视频| 久久精品成人av| 福利一区二区在线| 伊人网在线综合| aa国产精品| 国产盗摄视频在线观看| 免费久久精品| 国产不卡一区二区在线观看| 精品国产美女a久久9999| 欧美激情久久久| 香蕉视频在线免费看| 日韩av在线免费观看| 国产剧情久久久| 在线观看欧美黄色| 亚洲黄色一区二区| 亚洲另类在线一区| 精品熟妇无码av免费久久| 播五月开心婷婷综合| 手机av在线网| 日本vs亚洲vs韩国一区三区 | 精品欧美久久久| 888奇米影视| 欧美在线视频你懂得| 午夜精品三级久久久有码| 一级日本不卡的影视| 美女三级黄色片| 欧美激情在线一区二区| 日本少妇毛茸茸| 国产91色综合久久免费分享| 中文字幕亚洲乱码| 日韩高清不卡一区二区| 日韩少妇内射免费播放18禁裸乳| 欧美日韩亚洲三区| 亚洲小说欧美另类激情| 久久亚洲国产| 亚洲高清视频在线观看| 精品理论电影在线| 日本午夜精品一区二区三区| 欧美男人操女人视频| y111111国产精品久久婷婷| 精品久久亚洲| 成人在线激情视频| 不卡一区视频| 亚洲一区二区久久久久久| 9999在线精品视频| 91精品中文在线| 国产精品美女久久久久| 国产免费成人av| 中文字幕综合| 91在线视频成人| 欧美二区观看| 成人免费视频视频在| 日本精品在线播放| av免费观看久久| 国产精品对白久久久久粗| 高清不卡一区二区三区| 卡通动漫精品一区二区三区| 国内精品视频在线播放| 亚洲涩涩av| 日韩电影免费观看在| 欧美日韩老妇| 天天成人综合网| 欧美1区3d| 国产极品尤物在线| 久久精品一区| 亚洲天堂2018av| 国产精品中文欧美| 中文字幕乱码一区| 91免费视频网| 欧美亚洲色综久久精品国产| 亚洲视频香蕉人妖| 久操视频免费在线观看| 黑人精品xxx一区一二区| 色av性av丰满av| 宅男在线国产精品| 欧美性受xxxx狂喷水| 亚洲欧美日韩中文在线| 日本天堂在线观看| 久久久久久亚洲| 欧美不卡高清一区二区三区| 91精品国产综合久久香蕉最新版 | 成人激情综合| 国产在线播放91| 国产人妖ts一区二区| 欧美在线一二三区| 91精品精品| 国产精品50p| 九九九九九九九九| 日日骚欧美日韩| 精品人妻一区二区三| 99久久精品一区| 日韩一区二区三区四区视频| 亚洲精品成人少妇| 99精品人妻国产毛片| 欧美精品视频www在线观看| 欧美性受xxxx狂喷水| 亚洲一级一级97网| 狂野欧美性猛交xxxxx视频| 日韩av片免费在线观看| 精品一区二区三区亚洲| 欧美精品123| 欧美成人久久| 国产又大又黄又粗的视频| 国产福利视频一区二区三区| 人妻少妇一区二区| 一区二区三区四区在线免费观看| 国产精品一区无码| 日韩免费一区二区| 成年人在线观看| 久久久久久国产三级电影| 国产亚洲精彩久久| 精品国产乱码久久久久久蜜柚 | 久久久99精品免费观看不卡| 国产精品精品软件男同| 欧美性xxxxx极品娇小| 国产精品久久久久久久久毛片 | 日本精品久久久久久久久久| 青青草视频一区| av直播在线观看| 亚洲妇女屁股眼交7| 国产一区二区在线播放视频| 亚洲欧洲一区二区三区在线观看 | 亚洲影院在线看| 久久日文中文字幕乱码| 国产三区在线视频| 99re这里只有精品首页| 久久免费视频播放| 日韩欧美一级精品久久| 黄网站在线播放| 国产精品久久久久久久久久新婚| 一区二区三区日本久久久| 一本久道高清无码视频| 国产成人在线视频网站| 希岛爱理中文字幕| 欧美日韩久久一区二区| fc2在线中文字幕| 国产精品第8页| 激情婷婷综合| 粉嫩虎白女毛片人体| 91麻豆免费视频| 国产农村妇女aaaaa视频| 亚洲激情成人网| 欧美sm一区| 久久久久网址| 久久精品人人做人人爽电影蜜月| 亚洲国产精品无码久久久久高潮 | 亚洲一卡二卡在线| 日韩有码片在线观看| 激情中国色综合| 中文字幕中文字幕在线中一区高清| 美女视频免费一区| 日本激情视频一区二区三区| 欧美视频三区在线播放| 91在线视频| 亚洲中国色老太| 一区免费在线| 黄色正能量网站| 在线免费观看成人短视频| av在线首页| 成人福利免费观看| 在线观看国产精品入口| 日韩欧美中文视频| 香蕉成人伊视频在线观看| 婷婷视频在线观看| 国产精国产精品| 午夜久久免费观看| 欧美一级片在线免费观看| 亚洲高清三级视频| 久久久pmvav| 成人免费看片视频| 激情六月综合| 一区二区视频观看| 欧洲中文字幕精品| 二区三区四区高清视频在线观看| 99re在线视频上| 久久性天堂网| 日本裸体美女视频| 亚洲第一色在线| 精品176极品一区| www.日本在线视频| 久久久不卡网国产精品一区| 探花国产精品一区二区| 欧美肥臀大乳一区二区免费视频| 日韩mv欧美mv国产网站| 一级片视频免费观看| 亚洲一区二区精品视频| 久久免费看视频| 超碰97网站| 日韩中文字幕亚洲一区二区va在线| 激情五月激情综合| 亚洲福利视频专区| 欧美黄色网络| 日韩中文字幕三区| 亚洲色图视频网| 蜜芽tv福利在线视频| 亚洲尤物视频网| 日本大胆欧美人术艺术动态 | 精品国产99久久久久久| 国产私拍一区| 激情成人午夜视频| 亚洲欧美另类在线视频| 欧美日韩国产va另类| 欧洲激情综合| 色悠悠在线视频| 欧美高清www午色夜在线视频|