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

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 单词,还应覆盖空文本、中文和组合字符,核对恢复宽度后内容是否重新出现。若采用暂不绘制,确认消息仍保存在应用状态中,并能在有空间时恢复;不要为了修一个换行错误永久丢弃业务文本。