PythonIDE Docs
中文
简体中文

环境值 API

environment_value、color_scheme、locale、layout_direction 和动态字体。

environment_value(key, value) 用来设置少量通用环境值。它是一个通用入口;如果已经有更直接的专用修饰符,优先用专用修饰符。

读取系统环境使用 EnvironmentReader。写入和读取是两个方向:environment_value 向子树提供值,EnvironmentReader 把设备当前值写回 Python State

#签名

python
environment_value(key, value)

#什么时候用

  • 你想批量给一段视图树施加语言、方向、动态字体或文本环境。
  • 你要覆盖 localelayout_directiondynamic_type_size 这类没有独立高频包装的环境项。
  • 你已经知道目标 key,不想拆成多个专用修饰符。

#当前支持的 key

key作用更直接的写法
color_schemelight / dark强制明暗模式。preferred_color_scheme(...)
layout_directionleft_to_right / right_to_left控制布局方向。
locale语言地区标识,如 zh_CNen_US影响日期、数字、本地化格式。
line_spacing数字,如 46设置行距。
multiline_text_alignmentleading / center / trailing多行文本对齐。multiline_text_alignment(...)
allow_tight_spacingTrue / False是否允许文字收紧间距。
truncation_modetail / head / middle文本截断位置。truncation_mode(...)
dynamic_type_sizexSmallsmallmediumlargexLargexxLargexxxLargeaccessibility1accessibility5动态字体等级。
redactionplaceholder / none占位式骨架屏或取消 redaction。
autocorrectionTrue / False控制自动纠错;对输入控件更有意义。TextField / SecureField 优先用构造参数
text_caseuppercase / lowercase / none统一大小写风格。

#推荐写法

python
import appui


def body():
    return appui.NavigationStack(
        appui.VStack([
            appui.Text("环境值示例"),
            appui.Text("这段文字会使用更大的动态字体和更宽的行距。")
                .line_limit(2),
        ], spacing=12)
        .padding()
        .navigation_title("Environment")
        .environment_value("locale", "zh_CN")
        .environment_value("dynamic_type_size", "xLarge")
        .environment_value("line_spacing", 6)
    )


appui.run(body)

#EnvironmentReader

text
EnvironmentReader(content=None, values=None, on_change=None, keys=None,
                  onChange=None, children=None)

EnvironmentReader 是透明容器,不改变布局。values 推荐传 State.bind.<field>;系统环境真正变化时才会回写,不需要 Timer 或轮询。

可读 key:color_schemecolor_scheme_contrastdisplay_scaledynamic_type_sizehorizontal_size_classvertical_size_classlayout_directionlocalelegibility_weightreduce_motionreduce_transparencydifferentiate_without_colorscene_phase

python
import appui

state = appui.State(environment={})


def body():
    values = state.environment
    summary = (
        f"{values.get('horizontal_size_class', 'unknown')} · "
        f"{values.get('color_scheme', 'unknown')}"
    )
    content = appui.VStack([
        appui.Text("Responsive layout").font("headline"),
        appui.Text(summary).foreground_color("secondaryLabel"),
    ], spacing=8).padding()
    return appui.EnvironmentReader(
        content,
        values=state.bind.environment,
        keys=[
            "horizontal_size_class",
            "color_scheme",
            "reduce_motion",
            "dynamic_type_size",
        ],
    )


appui.run(body, state=state)

#专用修饰符优先

这些场景优先用专用 API,不要为了“统一写法”强行全部塞进 environment_value

  • 明暗模式:preferred_color_scheme("dark")
  • 多行文本对齐:multiline_text_alignment("leading")
  • 截断:truncation_mode("middle")
  • 输入框自动纠错:TextField(..., autocorrection_disabled=...)

#注意事项

  • environment_value 更适合“给一整段视图树施加环境”,不是每个修饰符都拿它代替。
  • EnvironmentReader 只接受上表列出的 key;未知 key 会在 Python 构建期直接报错,不会静默忽略。
  • reduce_motion=True 时,优先使用 Animation(...).respecting_reduce_motion()Transition(...).respecting_reduce_motion()
  • dynamic_type_size 依赖较新的系统版本;过低系统可能不会生效。
  • autocorrection 的实际体验最稳的方式仍然是直接在输入控件构造参数里声明。
  • 不在当前支持表里的 key 不保证生效。