0062-Tui-表格示例

news/2024/4/30 12:58:55/文章来源:https://www.cnblogs.com/jiangbo4444/p/16746251.html

环境

  • Time 2022-08-16
  • Rust 1.63.0
  • Tui 0.18.0

前言

说明

参考:https://github.com/fdehau/tui-rs/blob/master/examples/table.rs

目标

使用 tui-rs 显示表格。

定义应用


struct App<'a> {state: TableState,items: Vec<Vec<&'a str>>,
}impl<'a> App<'a> {fn new() -> App<'a> {App {state: TableState::default(),items: vec![vec!["阿法骨化醇软胶囊", "20.4", "5"],vec!["阿卡波糖胶囊", "9.6", "4"],vec!["阿仑膦酸钠片", "20.05", "7"],vec!["阿莫西林胶囊", "11.66", "2"],vec!["阿普仑片", "4.93", "6"],vec!["阿奇霉素胶囊", "15.3\n14.3", "1"],vec!["阿昔洛韦片", "5.46", "8"],],}}pub fn next(&mut self) {let i = match self.state.selected() {Some(i) => {if i >= self.items.len() - 1 {0} else {i + 1}}None => 0,};self.state.select(Some(i));}pub fn previous(&mut self) {let i = match self.state.selected() {Some(i) => {if i == 0 {self.items.len() - 1} else {i - 1}}None => 0,};self.state.select(Some(i));}
}

ui

fn ui<B: Backend>(frame: &mut Frame<B>, app: &mut App) {let chunks = Layout::default().constraints([Constraint::Percentage(100)]).margin(5).split(frame.size());let selected = Style::default().add_modifier(Modifier::REVERSED);let normal_style = Style::default().bg(Color::Blue);let header_cells = ["名称", "单价", "数量"].iter().map(|header| widgets::Cell::from(*header).style(Style::default().fg(Color::Red)));let header = widgets::Row::new(header_cells).style(normal_style).height(1).bottom_margin(1);let rows = app.items.iter().map(|item| {let height = item.iter().map(|content| content.chars().filter(|c| *c == '\n').count()).max().unwrap_or_default()+ 1;let cells = item.iter().map(|c| widgets::Cell::from(*c));widgets::Row::new(cells).height(height as u16).bottom_margin(1)});let t = widgets::Table::new(rows).header(header).block(Block::default().borders(Borders::ALL).title("Table")).highlight_style(selected).highlight_symbol(">> ").widths(&[Constraint::Percentage(50),Constraint::Length(30),Constraint::Min(10),]);frame.render_stateful_widget(t, chunks[0], &mut app.state);
}

效果展示

表格

总结

使用 tui-rs 渲染表格。

附录

源码

use anyhow::{Context, Result};
use crossterm::{event, terminal, ExecutableCommand};
use layout::{Constraint, Layout};
use style::{Color, Modifier, Style};
use tui::backend::{Backend, CrosstermBackend};
use tui::{layout, style, widgets, Frame, Terminal};
use widgets::{Block, Borders, TableState};pub fn main() -> Result<()> {terminal::enable_raw_mode()?;let mut backend = CrosstermBackend::new(std::io::stdout());backend.execute(terminal::EnterAlternateScreen)?.execute(terminal::Clear(terminal::ClearType::All))?.hide_cursor()?;let mut terminal = tui::Terminal::new(backend)?;run(&mut terminal)?;terminal::disable_raw_mode()?;terminal.backend_mut().execute(terminal::Clear(terminal::ClearType::All))?.execute(terminal::LeaveAlternateScreen)?.show_cursor().context("重置控制台失败")
}fn run<B: Backend>(terminal: &mut Terminal<B>) -> Result<()> {let timeout = std::time::Duration::from_millis(500);let mut app = App::new();loop {terminal.draw(|frame| ui(frame, &mut app))?;if event::poll(timeout)? {if let event::Event::Key(key) = event::read()? {use event::KeyCode::{self, Char, Esc};match key.code {Char('q') | Char('Q') | Esc => return Ok(()),KeyCode::Down => app.next(),KeyCode::Up => app.previous(),_ => {}}}}}
}struct App<'a> {state: TableState,items: Vec<Vec<&'a str>>,
}impl<'a> App<'a> {fn new() -> App<'a> {App {state: TableState::default(),items: vec![vec!["阿法骨化醇软胶囊", "20.4", "5"],vec!["阿卡波糖胶囊", "9.6", "4"],vec!["阿仑膦酸钠片", "20.05", "7"],vec!["阿莫西林胶囊", "11.66", "2"],vec!["阿普仑片", "4.93", "6"],vec!["阿奇霉素胶囊", "15.3\n14.3", "1"],vec!["阿昔洛韦片", "5.46", "8"],],}}pub fn next(&mut self) {let i = match self.state.selected() {Some(i) => {if i >= self.items.len() - 1 {0} else {i + 1}}None => 0,};self.state.select(Some(i));}pub fn previous(&mut self) {let i = match self.state.selected() {Some(i) => {if i == 0 {self.items.len() - 1} else {i - 1}}None => 0,};self.state.select(Some(i));}
}fn ui<B: Backend>(frame: &mut Frame<B>, app: &mut App) {let chunks = Layout::default().constraints([Constraint::Percentage(100)]).margin(5).split(frame.size());let selected = Style::default().add_modifier(Modifier::REVERSED);let normal_style = Style::default().bg(Color::Blue);let header_cells = ["名称", "单价", "数量"].iter().map(|header| widgets::Cell::from(*header).style(Style::default().fg(Color::Red)));let header = widgets::Row::new(header_cells).style(normal_style).height(1).bottom_margin(1);let rows = app.items.iter().map(|item| {let height = item.iter().map(|content| content.chars().filter(|c| *c == '\n').count()).max().unwrap_or_default()+ 1;let cells = item.iter().map(|c| widgets::Cell::from(*c));widgets::Row::new(cells).height(height as u16).bottom_margin(1)});let t = widgets::Table::new(rows).header(header).block(Block::default().borders(Borders::ALL).title("Table")).highlight_style(selected).highlight_symbol(">> ").widths(&[Constraint::Percentage(50),Constraint::Length(30),Constraint::Min(10),]);frame.render_stateful_widget(t, chunks[0], &mut app.state);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_16610.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用决策树判断要不要去相亲?

大家好&#xff0c;我是王老狮&#xff0c;上一篇我们简单介绍了下什么是决策树&#xff0c;这章我们来看如何根据实际问题构建决策树&#xff0c;然后来进行决策。 1.影响决策的重要因素&#xff0c;纯度和信息熵 我们先看一组数据集&#xff1a; 我们该如何构造一个判断是否…

【XSY4765】axelavir(DP)

称序列 ⟨a1,⋯,an⟩\langle a_1,\cdots,a_n\rangle⟨a1​,⋯,an​⟩ 是避免 120 的&#xff0c;当且仅当不存在 1≤k<j<i≤n1\leq k<j<i\leq n1≤k<j<i≤n&#xff0c;满足 ai<ak<aja_i<a_k<a_jai​<ak​<aj​。 假设 a1,⋯,ai−1a_1,\c…

微信小程序 java-php大学校园学生社团系统python

功能介绍 将系统权限按管理员和学生这两类涉及学生划分。 (a) 管理员&#xff1b;管理员使用本系统涉到的功能主要有&#xff1a;个人中心、学生管理、社长管理、社团简介管理、社团招新管理、系统管理等功能 (b)学生进入系统前台可以实现首页、我的、社团简介、社团论坛等功能…

web实训大作业 网页设计期末课程设计(HTML+CSS)

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…

APS排程软件帮机械加工企业解决交期承诺问题

相信很多做过生产计划的小伙伴都遇到过“交期承诺”的问题&#xff0c;实际生产中影响产品交期的因素有很多&#xff0c;进行“交期承诺”的计算不仅需要耗费大量时间&#xff0c;而且还只是估值&#xff0c;时间不准确&#xff0c;同时交期承诺影响订单交付&#xff0c;还影响…

大型企业——伙伴云,为什么会选择Baklib帮助中心?

当前产品的帮助中心不再只是为用户解决问题而存在&#xff0c;而更像是一个产品团队与用户进行交流的地方&#xff0c;你可以在这里介绍你的公司和产品&#xff0c;宣传你的理念&#xff0c;引导用户体验主打的功能&#xff0c;解答用户的问题&#xff0c;了解用户当前使用中遇…

P21升级后,用旧的spec模板生成的defime.xml中WhereClauses(VLM)里的逗号不能正常显示

背景&#xff1a;有个项目在P21升级之前&#xff08;v3.1.2&#xff09;做过一版defime.xml。后期因为某种原因导致数据集变更&#xff0c;同时define也需要重新生成。所以只能使用升级后的P21&#xff08;v4.0.1&#xff09;软件生成defime.xml。两次生成defime.xml使用的都是…

win10 安装Elasticsearch 安装 Kibana

1 下载 Elasticsearch &#xff08;ES需要有JDK环境&#xff0c;自行安装&#xff09; 官网 Download Elasticsearch | Elastic 这里下载的 8.4.2 Es 版本必须与 Kibana 版本对应 2 解压 打开 config 目录 3 找到 elasticsearch.yml 配置文件 4 修改 elasticsea…

JAVA中如何实现代码优化

1.用String.format拼接字符串 例&#xff1a;比如现在有个需求&#xff1a;要用get请求调用第三方接口&#xff0c;url后需要拼接多个参数。 1&#xff09; 以前我们的请求地址是这样拼接的&#xff1a;字符串使用号拼接&#xff0c;非常容易出错。 String url "http://…

Linux安全之SELinux理解

安全增强式 Linux&#xff0c;即SELinux(Security-Enhanced Linux)是一个 Linux 内核的安全模块&#xff0c;其提供了访问控制安全策略机制&#xff0c;包括了强制访问控制(Mandatory Access Control&#xff0c;MAC)。SELinux 是一组内核修改和用户空间工具&#xff0c;已经被…

0052-Tui-设置方块样式

环境Time 2022-08-09 Rust 1.62.0 Tui 0.18.0前言 说明 参考:https://github.com/fdehau/tui-rs/blob/master/examples/block.rs 目标 使用 tui-rs 对方块设置各种不同的样式。 设置背景色 let block = widgets::Block::default().title("设置背景色").style(style:…

跨境电商如何利用WhatsApp API交互式按钮提高客户转化率

WhatsApp API有很多实用的功能&#xff0c;跨境电商卖家因此可以为客户提供出色的客户服务体验与服务。 跨境电商卖家在通过WhatsApp API为客户提供服务或进行营销时&#xff0c;交互性功能可以明显提高客户转化率。因为当用户想要选择服务或产品时&#xff0c;可以直接使用交…

Java / Tensorflow - API 调用 pb 模型使用 GPU 推理

目录 一.引言 二.Java / Tensorflow 代码配置 1.代码配置 2.Maven 配置 三.环境检测 1.显卡检测 2.显卡监控 四.推理踩坑 1.异常现象 2.异常日志 五.安装 cuda-10.0 1.下载 cuda 安装包 2.安装 cuda 2.1 preface 前言 2.2 安装配置 2.3 安装完成 2.4 可能遇到的…

day013--mysql中的子查询

目录 一&#xff0c;前言 二&#xff0c;子查询的定义及书写格式 1&#xff0c;定义 2&#xff0c;书写格式 三&#xff0c;子查询的分类 1&#xff0c;单行子查询和多行子查询 2&#xff0c;相关子查询和非相关子查询 一&#xff0c;前言 相信大家还记得之前我们在学习分…

保研专业课参考

文章目录数据结构1.什么是平衡树&#xff1f;平衡树是怎么创建的&#xff1f;2.二叉排序树的性质&#xff1a;3.如何编程判断一棵二叉树是完全二叉树4.二叉树怎么求高度&#xff08;山大计算机&#xff09;5.在图中找到一个连通图&#xff0c;有n个顶点&#xff0c;n-1条边使得…

SQL Server大分区表没有空分区的情况下如何扩展分区的方法

官方文档https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-partition-function-transact-sql?viewsql-server-ver16 Best Practices Always keep empty partitions at both ends of the partition range. Keep the partitions at both ends to guarantee that th…

【学生网页作业】航海王动漫网页 html+ css + JavaScript 简单的学生网页作业源码

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…

手机用Postern配置socks5全局代理详细教程

以静态Socks5独享IP的单地区资源为例&#xff0c;即IP资源全部归属单一城市&#xff0c;不会变动&#xff0c;如南京区域&#xff0c;则IP全部为南京城市出口。 关于Socks5的使用有多种方案&#xff0c;可应用于PC&#xff0c;安卓&#xff0c;模拟器&#xff0c;请根据情况灵…

EasyRecovery15万能数据恢复软件全面详细功能讲解

EasyRecovery 15是由全球著名数据厂商Ontrack 出品的一款非常优秀的数据恢复软件&#xff0c;在诸多数据恢复软件中这款软件可以说是排的上名的&#xff0c;具有快捷、高效、便捷等特点&#xff0c;可以帮助用户轻松恢复电脑丢失的数据。 因此今天coco玛吉多就给大家带来了eas…

环境主题静态HTML网页作业作品 大学生环保网页设计制作成品 简单DIV CSS布局网站

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…