Rust终端UI框架cursive_core的使用,构建跨平台文本用户界面的核心库
Rust终端UI框架cursive_core的使用,构建跨平台文本用户界面的核心库
cursive-core是cursive终端UI框架的核心库,定义了大部分功能(不包括后端实现)。第三方库建议依赖cursive-core而不是cursive,因为它会有更少的语义版本破坏性更新。
安装
在项目目录中运行以下Cargo命令:
cargo add cursive_core
或者在Cargo.toml中添加以下行:
cursive_core = "0.4.6"
基本使用示例
下面是一个简单的cursive_core示例,创建一个基本的终端UI应用程序:
use cursive::{
Cursive,
views::{Dialog, TextView},
};
fn main() {
// 创建Cursive对象
let mut siv = Cursive::default();
// 创建一个带文本的对话框
siv.add_layer(
Dialog::around(TextView::new("Hello World!"))
.title("Cursive Demo")
.button("Quit", |s| s.quit()),
);
// 运行事件循环
siv.run();
}
完整示例
以下是一个更完整的示例,展示了如何使用cursive_core创建交互式终端UI:
use cursive::{
Cursive,
views::{
Dialog, EditView, LinearLayout, TextView,
Checkbox, RadioGroup, ListView
},
align::HAlign,
traits::*,
};
fn main() {
let mut siv = Cursive::default();
// 创建单选按钮组
let radio_group = RadioGroup::new()
.button("Option 1", "opt1")
.button("Option 2", "opt2")
.button("Option 3", "opt3");
// 创建表单布局
let layout = LinearLayout::vertical()
.child(TextView::new("Please fill the form:"))
.child(TextView::new("Name:"))
.child(EditView::new().fixed_width(20))
.child(TextView::new("Age:"))
.child(EditView::new().fixed_width(5))
.child(Checkbox::new().label("Agree to terms"))
.child(TextView::new("Select an option:"))
.child(radio_group)
.child(ListView::new()
.child("Item 1", TextView::new("Details 1"))
.child("Item 2", TextView::new("Details 2"))
);
// 添加对话框和按钮
siv.add_layer(
Dialog::around(layout)
.title("Interactive Form")
.h_align(HAlign::Center)
.button("Submit", |s| {
s.add_layer(Dialog::info("Form submitted!"));
})
.button("Cancel", Cursive::quit),
);
siv.run();
}
特性
- 跨平台支持:可以在任何支持终端的平台上运行
- 灵活的布局系统:支持垂直、水平布局和嵌套
- 丰富的控件:包括按钮、文本框、复选框、单选按钮等
- 事件驱动架构:响应式用户交互处理
- 主题支持:可自定义UI外观
文档
更多详细用法请参考官方文档
许可证
本项目采用MIT许可证发布。
1 回复
Rust终端UI框架cursive_core使用指南
简介
cursive_core是Rust中一个用于构建跨平台文本用户界面(TUI)的核心库。它提供了创建终端应用程序所需的底层组件和抽象,是cursive框架的基础。
主要特性
- 跨平台支持(Linux/macOS/Windows)
- 响应式布局系统
- 丰富的组件库(按钮、文本框、列表等)
- 事件驱动架构
- 主题和样式支持
基本使用方法
添加依赖
首先在Cargo.toml中添加依赖:
[dependencies]
cursive_core = "0.3.0"
创建基本应用
use cursive_core::Cursive;
use cursive_core::views::{Dialog, TextView};
fn main() {
// 创建Cursive对象
let mut siv = cursive_core::default();
// 创建一个带有文本的对话框
siv.add_layer(
Dialog::around(TextView::new("Hello, cursive_core!"))
.title("Greeting")
.button("Quit", |s| s.quit()),
);
// 运行应用
siv.run();
}
核心组件
视图(View)
视图是cursive_core中的基本构建块。以下是一些常用视图:
use cursive_core::views::{Button, Checkbox, EditView, ListView, TextView};
// 文本框
let text_view = TextView::new("Static text");
// 可编辑文本框
let edit_view = EditView::new()
.content("Editable text")
.fixed_width(20);
// 按钮
let button = Button::new("Click me", |s| {
s.add_layer(Dialog::info("Button clicked!"));
});
// 复选框
let checkbox = Checkbox::new().checked(true);
// 列表视图
let list = ListView::new()
.child("Item 1", TextView::new("Details 1"))
.child("Item 2", TextView::new("Details 2"));
布局
cursive_core提供多种布局方式:
use cursive_core::views::{LinearLayout, DummyView};
let layout = LinearLayout::vertical()
.child(TextView::new("Top"))
.child(DummyView) // 空白空间
.child(LinearLayout::horizontal()
.child(Button::new("Left", |_| {}))
.child(DummyView.fixed_width(10))
.child(Button::new("Right", |_| {}))
)
.child(DummyView.fixed_height(1))
.child(TextView::new("Bottom"));
事件处理
cursive_core使用回调函数处理事件:
use cursive_core::Cursive;
use cursive_core::event::Key;
use cursive_core::views::TextView;
fn main() {
let mut siv = cursive_core::default();
let text_view = TextView::new("Press q to quit")
.with_name("text");
siv.add_layer(text_view);
// 添加全局快捷键
siv.add_global_callback(Key::Char('q'), |s| s.quit());
// 动态更新视图
siv.add_global_callback(Key::Char('u'), |s| {
let mut text = s.find_name::<TextView>("text").unwrap();
text.set_content("Updated!");
});
siv.run();
}
主题定制
可以自定义应用的外观:
use cursive_core::theme::{Theme, Color, Palette, BorderStyle};
fn main() {
let mut siv = cursive_core::default();
// 创建自定义主题
let mut theme = Theme::default();
theme.shadow = false;
theme.borders = BorderStyle::Simple;
theme.palette[Palette::Background] = Color::Dark(Default::default());
theme.palette[Palette::View] = Color::Light(Default::default());
siv.set_theme(theme);
// ... 添加视图等
siv.run();
}
完整示例
下面是一个简单的待办事项应用示例:
use cursive_core::{
Cursive,
views::{Dialog, EditView, ListView, LinearLayout, TextView},
traits::Nameable,
};
fn main() {
let mut siv = cursive_core::default();
// 创建输入框和列表
let input = EditView::new()
.with_name("task_input")
.fixed_width(30);
let list = ListView::new()
.with_name="task_list");
// 创建布局
let layout = LinearLayout::vertical()
.child(TextView::new("Add a new task:"))
.child(input)
.child(Dialog::around(list).title("Tasks"))
.child(LinearLayout::horizontal()
.child(Button::new("Add", add_task))
.child(Button::new("Quit", |s| s.quit()))
);
siv.add_layer(Dialog::around(layout).title("Todo App"));
siv.run();
}
fn add_task(s: &mut Cursive) {
// 获取输入框内容
let task = s.call_on_name("task_input", |v: &mut EditView| {
let content = v.get_content();
v.set_content("");
content.to_string()
}).unwrap();
if !task.is_empty() {
// 添加到列表
s.call_on_name("task_list", |v: &mut ListView| {
v.add_child(&task, TextView::new(""));
});
}
}
跨平台注意事项
cursive_core设计为跨平台工作,但不同平台可能有细微差异:
- 在Windows上可能需要启用ANSI支持
- 某些终端模拟器可能不完全支持所有功能
- 复杂布局在小型终端上可能需要调整
进阶功能
- 自定义视图:实现
View
trait创建自己的组件 - 异步支持:与async/await集成
- 多线程:从其他线程更新UI
- 持久化:保存应用状态
cursive_core为构建丰富的终端应用提供了强大基础,结合cursive可以获得更多高级功能和现成组件。