DEBUG.WIKI
搬瓦工;先看线路,再选 VPS;CN2 GIA · 对应线路套餐;查看线路 →
野草云;香港 200Mbps 峰值;不限月流量 · BGP VPS;查看套餐 →
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS

Rich Text 设置居中仍靠左,给 Console.print 明确传 justify

Rich Text 自身设置居中,作为 Console.print 顶层参数时仍靠左。显式传递输出对齐方式,检查合并文本的属性边界和实际区域。

Text("hi", justify="center") 明明设置了居中,直接交给 Console.print() 却仍靠左;再给 print() 传一次 justify="center" 才正常。Rich 15.0.0 的顶层文本合并路径会让 Text 自身的部分布局属性丢失。

这不一定是终端宽度识别错误。即使使用固定宽度、输出到 StringIO,也有相同区别。内容和样式 span 仍可能存在,丢失的是决定如何排列它的属性。

在实际输出入口明确对齐方式

单段顶层文本需要居中时,可以在原来的 Console 输出位置显式给出 justify:

from rich.console import Console
from rich.text import Text

console = Console(width=20)
message = Text("hi", justify="center")
console.print(message, justify="center")

20 格只是示例宽度,实际使用项目原来管理的 Console 和区域约束。不要为了加一个关键字另建 Console,丢掉输出目标、日志捕获或颜色设置。

如果封装函数接受一个 Text,可以由封装明确决定是否把它的 justify 转交给输出入口;但 Console 中同时打印多个 Text 时,只能给合并后的输出一个统一参数,不能据此承诺各片段仍分别保持自己的对齐方式。布局需要多个独立区域时,应由原来的容器结构表达。

为什么放进容器后表现可能不同

顶层 print() 收集文本时,会创建一个带输出参数的分隔 Text,再用它连接待打印的 Text。连接结果从分隔对象复制属性;没有显式传 justify 时,分隔对象的值为 None,原 Text 的居中设置可能被覆盖。

某些容器会直接渲染内部 Text,不经过同一顶层连接路径,因此看起来正常。这可以帮助缩小范围,但随手包一个 Panel 会增加边框、padding 和宽度约束,不能把改变外观当成等价修复。

同一复制机制还涉及 overflow、no_wrap 等属性。若业务依赖它们,应分别核对实际输出入口支持的参数及组合;不能只修居中后就断言所有 Text 属性都被保留。文字裁切和折行需要独立验收。

截至 2026 年 10 月 26 日,正式 Rich 15.0.0 仍保留上述分隔连接实现。升级后用同一输出用例核对,再决定是否移除显式传参。

检查正常宽度与窄区域,确认文字位置、换行和内容均符合设计。用字符串断言时还要保留输出末尾换行与填充空格的约定;只看 .plain 相等无法验收对齐。如果终端窗口与固定宽度输出表现不同,再检查实际可用区域,而不是继续重复设置 Text 的同一个属性。