尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Textual 高度样式指南:深入理解 `height` 属性与 `<scalar>` 单位体系
Textual 高度样式指南深入理解height属性与scalar单位体系【免费下载链接】textualThe lean application framework for Python. Build sophisticated user interfaces with a simple Python API. Run your apps in the terminal and a web browser.项目地址: https://gitcode.com/gh_mirrors/te/textualheight是 Textual 中控制组件Widget垂直尺寸的核心样式属性它建立在scalar单位体系之上支持固定单元格、百分比、比例fr、相对视口vw/vh等多种取值方式。本文以 docs/styles/height.md 为主干结合 src/textual/css/scalar.py 等源码完整讲解height的语法、每种单位的计算规则、CSS 与 Python 双路设置方式以及它和box-sizing、min-height、max-height的协作关系让你能精确掌控 Textual 应用的纵向布局。height属性是什么height样式用于设置一个 Widget 的高度。它是 Textual 布局系统中与width对称的纵向尺寸属性两者都接收一个scalar类型的值。在 src/textual/css/styles.py 中height被声明为height ScalarProperty(percent_unitUnit.HEIGHT) Set the height of the widget.其中percent_unitUnit.HEIGHT的含义是当使用%百分比单位时高度百分比默认相对于容器的高度计算这一点与width的percent_unitUnit.WIDTH正好对应。语法height: scalar;与box-sizing的关系height默认设置的是**内容区content area的高度只有当box-sizing被设置为border-boxTextual 的默认值时height设置的才是边框区border area**的高度。也就是说box-sizing: border-box默认height包含边框与内边距加了padding或border后组件整体尺寸不变但内容空间被压缩box-sizing: content-boxheight只作用于内容区padding和border会在其基础上继续撑大组件。scalar单位体系全解height的取值本质是一个scalar长度值。完整的单位参考表源自 docs/css_types/scalar.md如下单位符号单位名称示例说明无单元格 Cell10单元格行/列数量唯一绝对单位fr分数 Fraction1fr组件应占据的空间比例%百分比 Percent75%相对于容器组件的长度w宽度 Width25w相对于容器组件宽度的百分比h高度 Height75h相对于容器组件高度的百分比vw视口宽度 Viewport width25vw相对于视口宽度的百分比vh视口高度 Viewport height75vh相对于视口高度的百分比—自动 Autoauto尝试计算恰好容纳内容、无需滚动的最优尺寸对应到源码这套单位被定义为 src/textual/css/scalar.py 中的Unit枚举以及符号映射表UNIT_SYMBOLscalar.py。各单位的计算规则Cell无符号高度方向上一格即一行。例如height: 10表示组件高度为 10 行。支持整数与浮点数但浮点数最终会被截断为整数。Fractionfr比例分配剩余空间。例如两个并排组件分别设height: 1fr与height: 3fr后者的高度就是前者的 3 倍。Percent%相对于容器可用空间的比例。height: 50%表示组件高度为容器高度的 50%。w单位相对于容器宽度的比例。height: 25w表示组件高度 容器宽度 × 25%。若容器宽 100 格则该组件高 25 格。h单位相对于容器高度的比例。height: 75h表示组件高度 容器高度 × 75%。vw单位相对于视口宽度的比例无视中间容器。视口宽度 终端宽度减去左右 dock 组件的宽度。height: 6.25vw即视口宽度的 6.25%。vh单位相对于视口高度的比例无视中间容器。视口高度 终端高度减去上下 dock 组件的高度。height: 75vh即视口高度的 75%。auto自动计算恰好容纳内容的最优高度。例如一个内容只有一行的Labelheight: auto时其高度就是 1 行。快速上手基础示例原文档附带的入门示例位于 docs/examples/styles/height.pyfrom textual.app import App from textual.widget import Widget class HeightApp(App): CSS_PATH height.tcss def compose(self): yield Widget() if __name__ __main__: app HeightApp() app.run()配套样式表 docs/examples/styles/height.tcssScreen Widget { background: green; height: 50%; color: white; }运行后屏幕上会出现一个绿色背景、高度正好占屏幕 50% 的组件。由于Screen屏幕是它的直接容器height: 50%最终解析为「屏幕高度的一半」。实战对照所有高度格式一次看全原文档的进阶示例用 9 个占位组件把全部单位放在同一个界面中对比演示脚本是 docs/examples/styles/height_comparison.pyfrom textual.app import App from textual.containers import VerticalScroll from textual.widgets import Label, Placeholder, Static class Ruler(Static): def compose(self): ruler_text ·\n·\n·\n·\n•\n * 100 yield Label(ruler_text) class HeightComparisonApp(App): CSS_PATH height_comparison.tcss def compose(self): yield VerticalScroll( Placeholder(idcells), Placeholder(idpercent), Placeholder(idw), Placeholder(idh), Placeholder(idvw), Placeholder(idvh), Placeholder(idauto), Placeholder(idfr1), Placeholder(idfr2), ) yield Ruler() if __name__ __main__: app HeightComparisonApp() app.run()每个Placeholder的id标明其所用的单位右侧还有一个 dock 的垂直标尺方便目测高度。完整的样式表 docs/examples/styles/height_comparison.tcss 如下#cells { height: 2; } #percent { height: 12.5%; } #w { height: 5w; } #h { height: 12.5h; } #vw { height: 6.25vw; } #vh { height: 12.5vh; } #auto { height: auto; } #fr1 { height: 1fr; } #fr2 { height: 2fr; } Screen { layers: ruler; overflow: hidden; } Ruler { layer: ruler; dock: right; width: 1; background: $accent; }假设终端为 80×24文档中对每个高度的注释对应 height_comparison.tcss 中的(1)!(9)!逐条解释了计算过程height: 2—— 固定 2 行高。height: 12.5%—— 容器VerticalScroll高 24 行12.5% × 24 3 行。height: 5w—— 直接容器宽 805% × 80 4 行高注意这里用的是容器的宽度。height: 12.5h—— 直接容器高 2412.5% × 24 3 行高用的是容器的高度。height: 6.25vw—— 视口宽 806.25% × 80 5 行高。height: 12.5vh—— 视口高 2412.5% × 24 3 行高。height: auto—— 内容仅一行因此高度解析为 1。height: 1fr—— 占据 1 份比例空间高度是2fr组件的一半。height: 2fr—— 占据 2 份比例空间高度是1fr组件的两倍。这组例子清楚展示了w/h与vw/vh的区别前两者相对直接容器的宽/高计算后两者相对视口的宽/高计算与中间容器无关。CSS 与 Python 双路设置CSS 方式/* 显式单元格高度 */ height: 10; /* 百分比高度 */ height: 50%; /* 自动高度 */ height: autoPython 方式self.styles.height 10 # 显式单元格高度可以是 int self.styles.height 50% self.styles.height auto从源码看ScalarProperty.__set__src/textual/css/_style_properties.py对 Python 侧的赋值做了三种归一化处理传入int/float直接封装为Unit.CELLS单元格单位传入字符串调用Scalar.parse()解析解析失败会抛出带帮助信息的StyleValueError传入Scalar对象原样采用。无论哪种途径只要规则真正发生变化都会触发refresh(layoutTrue)触发布局重算保证界面立即响应。源码级原理Scalar 的解析与解析height之所以能支持如此多样的单位核心在于 src/textual/css/scalar.py 中的Scalar类型一个由「数值 单位 百分比基准单位」组成的三元组其解析正则如下scalar.py_MATCH_SCALAR re.compile(r^(-?\d\.?\d*)(fr|%|w|h|vw|vh)?$).matchScalar.parse()会先特判auto其余情况按正则拆分数值与单位符号再映射为Unit枚举成员随后resolve()根据单位在RESOLVE_MAPscalar.py中选择对应的解析函数_resolve_cells直接返回数值本身_resolve_fraction返回fraction_unit × 数值_resolve_width数值 × 容器宽度 / 100_resolve_height数值 × 容器高度 / 100_resolve_view_width/_resolve_view_height分别以视口宽度、视口高度为基准换算。一个值得注意的细节Scalar内部还保存了percent_unit百分比基准单位。height在声明时传入了Unit.HEIGHT因此在resolve()中遇到%单位时会先用percent_unit替换后再查RESOLVE_MAP最终按容器高度计算——这正是「height: 12.5%相对容器高度」这一行为在源码中的落点。与 min-height、max-height、width 的配合height不是孤立属性它通常与以下属性协同工作min-height与max-height限制组件高度的下限与上限。在 styles.py 中它们同样以ScalarProperty(percent_unitUnit.HEIGHT)声明但通过allow_autoFalse禁用了auto取值——也就是说min-height/max-height不能写auto。width设置组件宽度与height共同构成组件的二维尺寸。常见用法给一个百分比高度的组件加min-height兜底避免终端窗口缩小时组件被压得过矮而不可用。小结height是 Textual 布局体系中最常用的纵向尺寸属性其核心在于scalar单位的灵活组合精确控制用单元格height: 10响应式布局用百分比height: 50%或相对视口的vh弹性分配空间用fr自适应内容用auto。理解每种单位相对「直接容器」还是「视口」计算对应源码中size与viewport两个入参再配合box-sizing、min-height/max-height即可在终端与浏览器两种运行环境下都获得稳定、可预期的纵向布局效果。更多相关样式可参考 docs/styles/index.md 的完整样式目录。【免费下载链接】textualThe lean application framework for Python. Build sophisticated user interfaces with a simple Python API. Run your apps in the terminal and a web browser.项目地址: https://gitcode.com/gh_mirrors/te/textual创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Podman `--inherit-labels` 选项深度解析:podman build 中基础镜像标签继承的控制机制

Podman `--inherit-labels` 选项深度解析:podman build 中基础镜像标签继承的控制机制

Podman --inherit-labels 选项深度解析:podman build 中基础镜像标签继承的控制机制 【免费下载链接】podman Podman: A tool for managing OCI containers and pods. 项目地址: https://gitcode.com/gh_mirrors/po/podman 本篇围绕 Podman 构建选项文件 inh…

📅 2026/9/19 20:58:49
NixOS 配置抽象:用 let 与函数消除 Nix 配置重复,以 Apache 虚拟主机为例

NixOS 配置抽象:用 let 与函数消除 Nix 配置重复,以 Apache 虚拟主机为例

NixOS 配置抽象:用 let 与函数消除 Nix 配置重复,以 Apache 虚拟主机为例 【免费下载链接】nixpkgs Nix Packages collection & NixOS 项目地址: https://gitcode.com/GitHub_Trending/ni/nixpkgs 本文围绕 NixOS 手动配置文档中的「抽象」&a…

📅 2026/9/19 20:58:49
Eino流式处理4大范式详解:Invoke、Stream、Collect与Transform实战指南

Eino流式处理4大范式详解:Invoke、Stream、Collect与Transform实战指南

Eino流式处理4大范式详解:Invoke、Stream、Collect与Transform实战指南 【免费下载链接】eino Go 语言编写的终极大型语言模型(LLM)应用开发框架,强调简洁性、可扩展性、可靠性与有效性。 项目地址: https://gitcode.com/CloudW…

📅 2026/9/19 20:58:49
MORE NEWS

更多资讯

📰

ERP选型实战指南:从业务场景反推技术能力

1. 这不是选软件,是选未来三年的业务操作系统ERP系统哪个好?——这问题我每天在客户会议室里听至少七遍。但真正该问的从来不是“哪个好”,而是“哪个能让我财务不加班改凭证、生产不靠Excel追料、销售不拿手机拍单据发给仓库”。2025年&…

📰

一网统管方案落地实战:数据架构、事件模型与性能优化

简介:这份《社会治理一网统管建设方案》PPT面向市域社会治理领域的方案设计者、政务信息化从业者及基层治理研究者,围绕统一平台、分级应用、分级登录的核心理念,系统梳理市、区县、乡镇、村社四级联动体系。内容涵盖总体设计、应用体系、支撑…

📰

Smart Connections 接 DeepSeek Harness,TaoToken 填 Key

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

CC Switch 接 TaoToken:Claude Code 秒切 GLM 5.3 Flash

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Atlas 300V 24G部署YOLOv5实战:从ONNX到OM的完整指南

后台上个月接了一个工业视觉项目,客户拿来的服务器里偏偏插的是Atlas 300V 24G,要跑YOLOv5做缺陷检测。我第一反应也是“这卡不是做视频解码的吗,能跑YOLO?”结果查了一圈之后发现,这卡不只是能跑,跑起来还…

📰

基于MSP430的辐射剂量仪开发:探测器选型、计数与标定

简介:基于MSP430单片机的便携式宽量程γ辐射剂量仪毕业设计论文,面向嵌入式与核辐射监测方向的学习者和研究人员。内容涵盖GM计数管探测电路、MSP430F149主控平台、信号采集处理、串口通讯、A/D采集、电源与报警模块,并设计了完整软件流程和剂…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬