在屏幕上实时修改数据 - Spectre 控制台系列
Spectre.Console 是一个 .NET 库,可以让您创建漂亮的控制台应用程序,远远超出普通的黑白命令行。在他的视频"在屏幕上实时修改数据 - Spectre Console 系列"中,Tim Corey 演示了 Spectre Console 实时显示功能。 该功能允许您在控制台应用程序中实时在屏幕上显示进度和更新数据。
在本文中,我们将逐步介绍 Tim 的视频,展示他做每一件事的地方以及他是如何解释的。
实时显示简介
Tim 首先解释了 Spectre.Console,以及它如何使您的控制台应用程序具有视觉吸引力。 在本系列中,每一课都是一个简短的示例,源代码链接在说明中。
他解释说,本课的重点是如何使用实时显示功能修改屏幕上的现有数据,以实现实时更新。 Tim 还鼓励观众订阅并访问 iamtimcorey.com 获取更多培训资源。
创建新的数据表
Tim 显示他已经创建了一个新表格,其中包含标题、课程和学时列。 该表格将用于呈现从 API 中提取的课程信息。
他还介绍了一种名为 CourseInfo 的记录类型,该类型具有强类型属性,包括课程名称、课时计数和课程长度(以小时为单位)。 在翻译过程中,译员必须使用".NET"、"Java"、"Python "或 "Node js "等语言,这反映了 API 的结构,让他能够以强类型的方式轻松输出文本。
表格已打开显示页脚,以便稍后显示总数。 Tim 指出,这种布局是 Spectre 为美观的控制台应用程序所支持的众多任意 widget 之一。
启动实时显示
Tim 使用 AnsiConsole.Live(table).StartAsync(...) 方法开始实时显示。 他指出,如果不需要等待长时间运行的任务,还有一个非同步的 Start() 函数。
他将代码封装在一个异步上下文中,这样控制台就能在新行到达时刷新。这展示了当前终端在不清除屏幕的情况下重绘输出的能力。
获取数据并显示进度
在实时上下文中,Tim 使用从 1 到 31 的 int 索引编写了一个 for 循环,因为示例 API 列出了 31 门课程。 对于每个索引,他都会调用一个助手类方法来获取 API 数据。
该辅助程序将原始 JSON 字符串转换为强类型的 CourseInfo 对象。 Tim 故意一次调用一个程序接口,而不是批量调用,以展示显示进度是如何实时进行的--这是在控制台环境中模拟长时间运行任务的一个很好的例子。
他指出,如果他只想要一个请求,他可以去掉 URL 中的 /i,但他正在进行多次调用,"以显示随着时间的推移而进入的东西"。
添加行和更新输出
对于每个返回的 CourseInfo 实例,Tim 都会调用 table.AddRow(...) 来创建新行,其中包含课程的标题、课时计数和时长。 他使用 $ 格式进行字符串插值,并在需要时调用 .ToString() 转换非字符串值。
这将渲染每次都有新行的表格,展示 Spectre 如何动态更新行。 他还演示了如何通过明确的转换抓住潜在的问题,如类型不匹配。
自定义页脚和运行总计
接下来,Tim 将展示如何为列添加自定义页脚。 他将 table.Columns[0].Footer 设置为显示迄今为止下载的课程数。 他在第二栏和第三栏中重复了这一做法,但这次是将所有课程的课程数和总学时相加。
通过这样做,用户可以一目了然地看到已经累计了多少节课和多少小时。 这是一个使用 Spectre 控件在实时数据旁显示数值总计的真实示例。
Tim 简要地 "取消 "了窗口,这样您就可以看到数字增长时的完整布局。 他解释说,页脚是 Spectre 提供的内置样式的一部分,就像边框、标记和主题一样。
每次操作后刷新上下文
Tim 强调了实时显示的 "关键之处":在进行更改后,一定要调用 context.Refresh()。 这将确保终端实际使用新数据重绘您的输出。 如果不这样做,您的行、页脚甚至不同的颜色都不会出现,直到直播会话结束。
调试和异常处理
第一次运行代码时,Tim 遇到了 Index Out of Range 异常。 他讲述了自己的错误--数错了列的索引(是 0,1,2,不是 0,2,3)--并进行了纠正。
在此温馨提醒:即使是在 Spectre.Console 中,您也应该捕捉错误并确保索引和参数正确无误。

观看实时显示
Tim 运行了修正后的代码,并展示了实时显示的效果:添加行、更新总数以及在页脚显示合并值。
您可以看到 "1,652 节课"、"403.5 小时 "和 "31 门课程 "的数据流。 正是这种操作,让 Spectre Console 实时显示感觉就像您当前终端内的仪表盘。

只关注页脚
为了让改动更明显,Tim 注释了添加行的代码,因此只有页脚会更新。 这显示了即使不滚动数据,您也可以实时跟踪总数。
他还指出,当数字增长时(例如从 9 增至 10),Spectre 会自动调整列宽。 这是该库自动检测宽度和格式的一个小而强大的示例。

表格之外 - 任意小工具和主题
Tim 解释说,实时显示不仅限于表格。 您可以将其应用于任意部件,如面板、提示用户输入甚至条形图。 您可以更新文本、突出显示不同颜色、应用自定义彩色编码主题或添加旋转器。
他提到,您可以更改蓝色、绿色或灰色等风格,以匹配您的主题,甚至还可以使用嵌套布局或小部件。 这种灵活性使得 Spectre 受到其他生态系统中丰富的控制台工具(有些甚至是用 Python 编写的)的 "极大启发",但又是为 .NET 量身定制的。
同步与同步实时显示启动
Tim 解释了他使用异步版本的原因:因为他在等待 API 调用。 如果您的更新不是异步的,您可以直接调用 Start() 而无需 await。
该选择可帮助您构建精美的控制台应用程序,即使在长时间运行任务的情况下也能保持反应灵敏。
结论
在他的视频中,Tim 刚刚展示了如何构建一个 Spectre 控制台实时显示屏,它可以在控制台内部直接更新、汇总和刷新数据。
这为提示用户输入、添加小部件或构建具有不同颜色和自定义彩色编码主题的仪表盘奠定了坚实的基础。 结合 Spectre 可以轻松输出文本、使用标记和创建面板或树等控件的功能,您可以在终端上创建动态 .NET 应用程序。
Tim 的演示表明,使用 Spectre.Console 不仅可以创建仪表盘,还可以创建实时更新表、旋转器和其他小工具。 这是一个将普通控制台转变为实时互动工具的实用范例,也是向用户表达 "编码愉快 "的好方式。

