#窗口 #终端窗口 #后端 #事件 #像素化

winterm

一个用于在终端内创建像素化窗口的Rust库

4个版本 (破坏性更新)

0.6.0 2022年11月3日
0.5.0 2022年8月10日
0.4.0 2022年7月24日
0.3.0 2022年7月7日
0.1.0 2022年6月25日

#16 in #终端窗口

MIT 许可证

13KB
209

winterm

Crates.io docs.rs

example image

一个用于在终端内创建像素化窗口的Rust库。

它使用 crossterm 作为后端。

演示

cargo run --example demo

文档

https://docs.rs/winterm/latest/winterm/


lib.rs:

winterm

一个用于在终端内创建像素化窗口的Rust库。

它使用 [crossterm] 作为后端。

将 winterm 添加为依赖项

cargo add [email protected]
cargo add [email protected]

创建窗口

use winterm::Window;

let mut window = Window::new(height, width)?;

渲染下一帧

use crossterm::style::Color;

window.set_pixel(0, 0, Color::Red);
window.set_pixel(
    y,
    x,
    Color::Rgb {
        r: 0x3E,
        g: 0xB4,
        b: 0x89,
    },
);
window.redraw()?;

响应用户操作

use crossterm::event::KeyCode;

window.poll_events()?;
if window.get_key(KeyCode::Esc) {
    // the Escape key has been pressed
}
if window.get_key(KeyCode::Char('w')) {
    // the W key has been pressed
}

示例

use crossterm::{event::KeyCode, style::Color, Result};
use winterm::Window;

fn main() -> Result<()> {
    let mut window = Window::new(9, 16)?;
    let mut color = Color::Black;
    loop {
        window.poll_events()?;
        if window.get_key(KeyCode::Esc) {
            break;
        }
        if window.get_key(KeyCode::Char('n')) {
            color = match color {
                Color::Black => Color::Red,
                Color::Red => Color::Rgb {
                    r: 0x3E,
                    g: 0xB4,
                    b: 0x89,
                },
                _ => Color::Black,
            }
        }
        for y in 0..window.height() {
            for x in 0..window.width() {
                window.set_pixel(y, x, color);
            }
        }
        window.redraw()?;
    }
    Ok(())
}

调试

由于 winterm 使用终端的“替代屏幕”,因此使用打印函数进行调试可能会很复杂。

处理此问题的方法之一是使用 stderr(例如 dbg!eprintln! 等)并将其重定向到文件

cargo run 2> logs

现在您可以在执行后使用 cat logs 或者在另一个终端中 tail -f logs 来获取输出,同时代码仍在运行。

依赖项

~4–15MB
~130K SLoC