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("✓", "自定义进度完成");
}

这个完整示例展示了:

  1. 基本的spinner创建
  2. 更新spinner样式和消息
  3. 使用自定义spinner动画
  4. 颜色控制
  5. 不同的完成状态显示

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

注意事项

  1. 确保在程序退出前调用successfailwarnclear方法,否则旋转器可能会留在终端中
  2. 在多线程环境中使用时,确保对Spinner实例的访问是线程安全的
  3. 某些终端可能不支持所有颜色或动画效果

完整示例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("操作失败!");
}
回到顶部