Rich Text.wrap 宽度为 0 报 range 步长错误
Rich 15.0.0 的 Text.wrap 收到零宽度时,单格文本会触发 range 步长错误。检查真正的内部区域,并为没有空间定义明确的显示策略。
Rich 界面缩到很窄时,Text.wrap(console, width=0) 报 ValueError: range() arg 3 must not be zero,同样的布局放中文却未必崩溃。先看传给换行函数的实际可用宽度,不要按文本语言分别捕获异常。
Rich 15.0.0 的单格字符快速路径会执行 range(0, len(text), width)。宽度为 0 时,步长为零直接触发错误;宽字符走另一条算法,因此“中文没报错”不能证明零宽度输入受到一致支持。这里是 Text 换行的分块问题,与 Columns 把列数算成零后取模的位置不同。
在布局边界明确处理没有空间的情况
先核对宽度来自整个终端、表格列,还是 Panel 扣除边框和 padding 后的内部区域。总终端很宽,也可能有一个内部区域只剩 0 格。窗口变化后继续使用启动时缓存的尺寸,也会把已经失效的约束传进组件。
若业务允许在没有空间时暂不绘制这段内容,可以在调用公开换行接口前分支:
from rich.text import Text
def wrap_when_visible(text: Text, console, available_width: int):
if available_width <= 0:
return []
return text.wrap(console, available_width)
这段明确选择了“零空间不显示”,返回值只适用于能消费一组行的调用方。若这段文字是必须可见的错误信息,应改为在更外层的可用区域显示,或调整布局;返回空列表会暂时隐藏它,不能对所有消息统一使用。
简单把宽度改为 max(1, width) 也有前提:父容器必须确实允许至少一格,否则只是把越界绘制问题往外推。对两格宽字符,一格区域还需由项目选择折行、裁切或替代显示;“不再异常”不表示完整显示。
不要修改私有分块函数来掩盖尺寸来源
正式 Rich 15.0.0 的单格分块仍没有零宽度保护。直接覆盖 _wrap.divide_line 或安装目录函数,会把未维护的兼容逻辑扩散到其他组件,也可能改变负宽度和空文本的处理。
应用自己声明的固定宽度无效时,应先修正那项配置;正常缩窗会出现零空间时,则应在布局设计中保留明确的降级方式。换成宽字符让异常消失,不会使布局约束变得正确。
检查正常宽度、恰好零宽度、负值配置以及窗口反复缩放。除 ASCII 单词,还应覆盖空文本、中文和组合字符,核对恢复宽度后内容是否重新出现。若采用暂不绘制,确认消息仍保存在应用状态中,并能在有空间时恢复;不要为了修一个换行错误永久丢弃业务文本。


