Rust终端微调动画库spinoff的使用:轻量级命令行进度条与状态指示器
Rust终端微调动画库spinoff的使用:轻量级命令行进度条与状态指示器
spinoff是一个易于使用、功能强大的Rust库,用于在终端显示旋转动画指示器(spinners)。
安装
在项目的Cargo.toml
中添加依赖:
[dependencies]
spinoff = "0.8.0"
基本使用
use spinoff::{Spinner, spinners, Color};
use std::thread::sleep;
use std::time::Duration;
let mut spinner = Spinner::new(spinners::Dots, "Loading...", Color::Blue);
sleep(Duration::from_secs(3));
spinner.success("Done!");
更新spinner
use spinoff::{Spinner, spinners, Color};
use std::thread::sleep;
use std::time::Duration;
let mut spinner = Spinner::new(spinners::Aesthetic, "Loading...", Color::Red);
sleep(Duration::from_secs(3));
spinner.update(Spinners::Dots2, "Retrying...", None);
sleep(Duration::from_secs(3));
spinner.stop()
指定输出流
use spinoff::{Spiner, spinners, Color, Streams};
use std::thread::sleep;
use std::time::Duration;
let mut spinner = Spinner::new_with_stream(spinners::Line, "Loading...", Color::Yellow, Streams::Stderr);
sleep(Duration::from_secs(3));
spinner.stop_and_persist("📜", "Task done.");
完整示例代码
use spinoff::{Spinner, spinners, Color};
use std::thread::sleep;
use std::time::Duration;
fn main() {
// 创建一个蓝色圆点风格的spinner
let mut spinner = Spinner::new(spinners::Dots, "正在加载数据...", Color::Blue);
// 模拟耗时操作
sleep(Duration::from_secs(2));
// 更新spinner状态
spinner.update(spinners::Line, "处理数据中...", Some(Color::Green));
sleep(Duration::from_secs(2));
// 完成并显示成功消息
spinner.success("操作成功完成!");
// 另一个示例:创建自定义spinner
let frames = spinner!([">", ">>", ">>>"], 100);
let mut custom_spinner = Spinner::new(frames, "自定义进度...", None);
sleep(Duration::from_millis(800));
custom_spinner.stop();
}
自定义spinner
你可以使用spinner!
宏创建自己的spinner动画:
use spinoff::*;
use std::thread::sleep;
use std::time::Duration;
let frames = spinner!([">", ">>", ">>>"], 100);
let mut sp = Spinner::new(frames, "Hello World!", None);
sleep(Duration::from_millis(800));
sp.stop();
Windows用户注意事项
为了使颜色正常显示,Windows用户需要添加以下代码:
use colored::control
control::enable_virtual_terminal(true).unwrap();
spinoff包含80多种预设的spinner样式,默认全部启用。你也可以在Cargo.toml中按需启用特定样式:
[dependencies]
spinoff = { version = "0.8.0", features = ["dots", "arc", "line"] }
完整示例demo
use spinoff::{Spinner, spinners, Color};
use std::thread::sleep;
use std::time::Duration;
fn main() {
// 初始化spinner
let mut spinner = Spinner::new(
spinners::Dots,
"正在初始化系统...",
Color::Cyan
);
// 第一阶段处理
sleep(Duration::from_secs(2));
// 更新spinner状态
spinner.update(
spinners::Arc,
"正在处理数据...",
Some(Color::Yellow)
);
sleep(Duration::from_secs(3));
// 第二阶段处理
spinner.update(
spinners::Line,
"正在验证结果...",
Some(Color::Green)
);
sleep(Duration::from_secs(1));
// 完成处理
spinner.success("所有操作已完成!");
// 创建自定义spinner
let custom_frames = spinner!(["[ ]", "[= ]", "[== ]", "[=== ]", "[ ===]", "[ ==]", "[ =]"], 80);
let mut custom_spinner = Spinner::new(
custom_frames,
"自定义进度指示器...",
Some(Color::Magenta)
);
sleep(Duration::from_secs(2));
custom_spinner.stop_and_persist("✓", "自定义进度完成");
}
这个完整示例展示了:
- 基本的spinner创建
- 更新spinner样式和消息
- 使用自定义spinner动画
- 颜色控制
- 不同的完成状态显示
对于Windows用户,记得在main函数开头添加虚拟终端支持:
use colored::control;
control::enable_virtual_terminal(true).unwrap();
1 回复
Rust终端微调动画库spinoff使用指南
spinoff
是一个轻量级的Rust库,用于在命令行界面中创建美观的进度条和状态指示器。它特别适合需要长时间运行的任务,为用户提供视觉反馈。
安装
在Cargo.toml
中添加依赖:
[dependencies]
spinoff = "0.7"
基本用法
创建简单的旋转器
use spinoff::{Spinner, spinners};
fn main() {
let spinner = Spinner::new(spinners::Dots, "Loading...", None);
// 模拟耗时任务
std::thread::sleep(std::time::Duration::from_secs(3));
spinner.success("Task completed!");
}
可用的旋转器类型
spinoff
提供了多种内置的旋转器样式:
use spinoff::{Spinner, spinners};
let spinner = Spinner::new(spinners::Dots, "Dots spinner", None);
// 或
let spinner = Spinner::new(spinners::Line, "Line spinner", None);
// 或
let spinner = Spinner::new(spinners::Bounce, "Bounce spinner", None);
高级用法
自定义颜色
use spinoff::{Spinner, spinners, Color};
let spinner = Spinner::new(
spinners::Arc,
"Colored spinner",
Some(Color::Blue)
);
更新消息
use spinoff::{Spinner, spinners};
let mut spinner = Spinner::new(spinners::Bounce, "Initial message", None);
// 模拟任务进度
std::thread::sleep(std::time::Duration::from_secs(1));
spinner.update("Processing step 1...");
std::thread::sleep(std::time::Duration::from_secs(1));
spinner.update("Processing step 2...");
结束状态
use spinoff::{Spinner, spinners};
let spinner = Spinner::new(spinners::Dots, "Working...", None);
// 任务完成后可以设置不同的结束状态
spinner.success("Success!"); // 绿色√
// 或
spinner.fail("Failed!"); // 红色×
// 或
spinner.warn("Warning!"); // 黄色!
// 或
spinner.clear(); // 直接清除
自定义字符旋转器
use spinoff::{Spinner, spinners};
let custom_frames = vec!["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
let spinner = Spinner::new_with_stream(custom_frames, "Custom spinner", None);
进度条功能
spinoff
也可以创建简单的进度条:
use spinoff::{Spinner, spinners};
let mut spinner = Spinner::new(spinners::Bar, "Downloading...", None);
for i in 0..=100 {
spinner.update_text(&format!("Downloading... {}%", i));
std::thread::sleep(std::time::Duration::from_millis(50));
}
spinner.success("Download complete!");
注意事项
- 确保在程序退出前调用
success
、fail
、warn
或clear
方法,否则旋转器可能会留在终端中 - 在多线程环境中使用时,确保对
Spinner
实例的访问是线程安全的 - 某些终端可能不支持所有颜色或动画效果
完整示例DEMO
下面是一个综合使用spinoff
各种功能的完整示例:
use spinoff::{Spinner, spinners, Color};
use std::thread;
use std::time::Duration;
fn main() {
// 1. 基本旋转器示例
let spinner1 = Spinner::new(spinners::Dots, "正在加载基础数据...", None);
thread::sleep(Duration::from_secs(2));
spinner1.success("基础数据加载完成!");
// 2. 带颜色的旋转器
let spinner2 = Spinner::new(
spinners::Line,
"正在处理彩色任务...",
Some(Color::Green)
);
thread::sleep(Duration::from_secs(2));
spinner2.success("彩色任务完成!");
// 3. 更新消息的旋转器
let mut spinner3 = Spinner::new(spinners::Bounce, "初始化处理...", None);
thread::sleep(Duration::from_secs(1));
spinner3.update("处理第一阶段...");
thread::sleep(Duration::from_secs(1));
spinner3.update("处理第二阶段...");
thread::sleep(Duration::from_secs(1));
spinner3.success("多阶段处理完成!");
// 4. 自定义帧动画旋转器
let custom_frames = vec!["⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"];
let spinner4 = Spinner::new_with_stream(custom_frames, "自定义动画处理中...", None);
thread::sleep(Duration::from_secs(2));
spinner4.clear();
// 5. 进度条示例
let mut spinner5 = Spinner::new(spinners::Bar, "文件下载进度:", None);
for i in 0..=100 {
if i % 10 == 0 {
spinner5.update_text(&format!("文件下载进度: {}%", i));
}
thread::sleep(Duration::from_millis(50));
}
spinner5.success("文件下载完成!");
// 6. 失败状态示例
let spinner6 = Spinner::new(spinners::Arc, "危险操作中...", None);
thread::sleep(Duration::from_secs(1));
spinner6.fail("操作失败!");
}