PythonIDE Docs
中文
简体中文

ui 概览

Pythonista 风格原生 UI 组件与交互。

Pythonista 风格原生 UI 组件与交互。

#预期效果

运行示例后会出现一个手动 frame 布局的原生 sheet,点击按钮会直接修改按钮标题。

#适用场景

Pythonista 风格命令式 UI,使用 frame/flex 手动布局;新 MiniApp 默认优先用 appui。

#先选写法

需求首选原因
迁移 Pythonista 风格的 ui 脚本ui代码通常已经按 Viewframeaction(sender) 组织。
新建设置页、表单、列表或多页面工具appui状态、导航、输入和动态列表更容易维护。
需要 Sprite、触摸循环、物理或逐帧绘制scene场景生命周期和渲染循环更适合动画与小游戏。
只需要桌面小组件widget小组件有独立的 WidgetKit 约束和刷新模型。
只想生成一张图片或画布ui.ImageContext / CanvasView不需要完整页面时,离屏绘图更轻。

#标准示例

python
import ui

def tapped(sender):
    sender.title = "Tapped"

view = ui.View(frame=(0, 0, 320, 220))
view.name = "ui demo"
button = ui.Button(frame=(40, 80, 240, 44), title="Tap")
button.action = tapped
view.add_subview(button)
view.present("sheet")

#写 ui 的心智模型

  1. 根视图:创建一个有明确尺寸的 ui.View(frame=...)
  2. 子视图:按钮、标签、输入框和图片用 add_subview(...) 挂到父视图。
  3. 布局:用 frame 设定初始位置,用 flex 处理简单的横竖屏变化。
  4. 交互:控件回调接收 sender,在回调里修改标题、文本、颜色或子视图。
  5. 呈现:脚本末尾调用一次 present(...),不要在导入模块时弹出多个页面。
  6. 迁移:当状态、列表和导航开始变复杂,就把新页面迁到 appui

#API 参考

类型API签名说明
classColorColor(r: float, g: float, b: float, a: float=1.0) -> None颜色类,兼容Pythonista的ui.Color
classPointPoint(x: Union[float, Sequence[float]]=0.0, y: float=0.0) -> None二维点,兼容 Pythonista 的 ui.Point
classSizeSize(w: Union[float, Sequence[float]]=0.0, h: float=0.0) -> None尺寸,兼容 Pythonista 的 ui.Size
classRectRect(x: Union[float, Sequence[float]]=0.0, y: float=0.0, w: float=0.0, h: float=0.0) -> None矩形,兼容 Pythonista 的 ui.Rect
classTransformTransform(a: float=1.0, b: float=0.0, c: float=0.0, d: float=1.0, tx: float=0.0, ty: float=0.0) -> None2D 仿射变换,兼容 Pythonista 的 ui.Transform
classTouchTouch(location: Sequence[float]=..., prev_location: Optional[Sequence[float]]=..., phase: str=..., touch_id: int=..., timestamp: Union[int, float]=...) -> None触摸事件,兼容 Pythonista 的 ui.Touch(简化实现)
classGestureSenderGestureSender(view: Optional[View]=..., state: int=..., location: Sequence[float]=..., translation: Sequence[float]=..., scale: float=..., direction: int=...) -> None手势识别器回调的 sender 对象,兼容 Pythonista(state, location, translation, scale, direction)
classGestureRecognizerGestureRecognizer(gesture_id: str) -> None手势识别器基类,兼容 Pythonista(action(sender))
classTapGestureRecognizerTapGestureRecognizer() -> None点击手势(Pythonista 兼容)
classPanGestureRecognizerPanGestureRecognizer() -> None拖动手势(Pythonista 兼容)
classPinchGestureRecognizerPinchGestureRecognizer() -> None捏合手势(Pythonista 兼容)
classSwipeGestureRecognizerSwipeGestureRecognizer() -> None滑动手势(Pythonista 兼容),direction: LEFT=1, RIGHT=2, UP=3, DOWN=4
classLongPressGestureRecognizerLongPressGestureRecognizer() -> None长按手势(Pythonista 兼容)
functionparse_colorparse_color(color: Any) -> Tuple[float, float, float, float]解析颜色参数为RGBA元组,支持语义色(systemBackground 等)自适应深色/浅色模式
classFontFont(name: str=..., size: float=...) -> None字体类,兼容Pythonista的ui.Font
functionparse_fontparse_font(font: Any) -> Tuple[str, float]解析字体参数为(name, size)元组
classViewView(frame: Optional[_Frame]=..., **kwargs: Any) -> None视图基类,所有UI组件的父类
classButtonItemButtonItem(title: str=..., image: Any=..., action: Optional[Callable[..., Any]]=..., **kwargs: Any) -> None导航栏按钮项,用于 left_button_items / right_button_items
classButtonButton(frame: Optional[_Frame]=..., title: str=..., **kwargs: Any) -> None按钮组件
classLabelLabel(frame: Optional[_Frame]=..., text: str=..., **kwargs: Any) -> None文本标签组件
classTextFieldTextField(frame: Optional[_Frame]=..., text: str=..., placeholder: str=..., **kwargs: Any) -> None单行文本输入组件
classTextViewTextView(frame: Optional[_Frame]=..., text: str=..., **kwargs: Any) -> None多行文本输入组件
classImageViewImageView(frame: Optional[_Frame]=..., **kwargs: Any) -> None图片显示组件
classWebViewWebView(frame: Optional[_Frame]=..., **kwargs: Any) -> None网页视图
classActivityIndicatorActivityIndicator(frame: Optional[_Frame]=..., **kwargs: Any) -> None加载指示器
classTableViewTableView(frame: Optional[_Frame]=..., **kwargs: Any) -> None表格视图
classListDataSourceListDataSource() -> NoneTableView 数据源协议 子类实现 tableview_number_of_sections, tableview_number_of_rows, tableview_cell_for_row 等
classTableViewCellTableViewCell(style: str=..., **kwargs: Any) -> None表格行单元,兼容 Pythonista
classSwitchSwitch(frame: Optional[_Frame]=..., value: bool=..., **kwargs: Any) -> None开关组件
classSliderSlider(frame: Optional[_Frame]=..., **kwargs: Any) -> None滑块组件
classSegmentedControlSegmentedControl(frame: Optional[_Frame]=..., **kwargs: Any) -> None分段控制器
classDatePickerDatePicker(frame: Optional[_Frame]=..., **kwargs: Any) -> None日期时间选择器
classProgressViewProgressView(frame: Optional[_Frame]=..., **kwargs: Any) -> None进度条组件,兼容 Pythonista 的 ui.ProgressView
classStepperStepper(frame: Optional[_Frame]=..., **kwargs: Any) -> None步进器组件,兼容 Pythonista 的 ui.Stepper
classNavigationViewNavigationView(view: Optional[View]=..., **kwargs: Any) -> None导航视图,支持 push_view / pop_view 兼容 Pythonista 的 ui.NavigationView
classScrollViewScrollView(frame: Optional[_Frame]=..., **kwargs: Any) -> None滚动视图,兼容 Pythonista 的 ui.ScrollView 可容纳超出可见区域的子视图并支持滚动
classPathPath() -> None路径类,兼容 Pythonista 的 ui.Path 在 ImageContext 内使用
classGStateGState()with ui.GState(): 保存和恢复绘图状态
classImageContextImageContext(width: float, height: float) -> None离屏绘图上下文,兼容 Pythonista 的 ui.ImageContext with ui.ImageContext(100, 100) as ctx: ui.set_color('red') ui.fill_rect(0, 0, 50, 50) img = ctx.get_image() # 可在 with 块内调用,会立即结束上下文并返回图像
classImageImage(data: bytes=...) -> None图像类,兼容 Pythonista 的 ui.Image
functionbegin_image_contextbegin_image_context(width: float, height: float) -> NoneStart an image drawing context (Pythonista-compatible standalone function).
functionend_image_contextend_image_context() -> NoneEnd the current image drawing context.
functionget_image_from_current_contextget_image_from_current_context() -> ImageCapture the current drawing context as an Image. Call before end_image_context() to get the drawn image, or after end_image_context() to retrieve the last captured result.
functionset_colorset_color(color: _ColorLike) -> None设置当前绘图颜色
functionfill_rectfill_rect(x: float, y: float, w: float, h: float) -> None填充矩形
functionstroke_rectstroke_rect(x: float, y: float, w: float, h: float) -> None描边矩形
functiondraw_stringdraw_string(text: str, rect: Any=..., font: _FontLike=..., color: _ColorLike=..., alignment: int=..., line_break_mode: int=...) -> None绘制字符串 rect: (x, y, w, h) 元组
classCanvasViewCanvasView(frame: Optional[_Frame]=..., **kwargs: Any) -> None画布视图,通过 render(draw_func) 自绘内容 兼容 Pythonista 的 ui 画布用法
functionget_screen_sizeget_screen_size() -> Tuple[float, float]获取屏幕尺寸
functionget_window_sizeget_window_size() -> Size获取窗口尺寸(同 get_screen_size)
functionget_keyboard_frameget_keyboard_frame() -> Tuple[float, float, float, float]获取键盘在屏幕上的 frame (x, y, width, height);未显示时为 (0, 0, 0, 0)(Pythonista 兼容)
functionget_ui_styleget_ui_style() -> str获取当前 UI 风格:'light' 或 'dark'(Pythonista 兼容)
functionmeasure_stringmeasure_string(text: str, max_width: float=..., font: _FontLike=..., alignment: int=..., line_break_mode: int=...) -> Tuple[float, float]测量字符串尺寸,返回 (width, height)
functiondelaydelay(seconds: float, func: Callable[..., Any]) -> None延迟 seconds 秒后执行 func(Pythonista 兼容)。可用 cancel_delays() 取消未执行的 delay。
functioncancel_delayscancel_delays() -> None取消所有通过 delay() 调度且尚未执行的回调(Pythonista 兼容)
functionin_backgroundin_background(fn: Callable[..., Any]) -> Callable[..., None]装饰器:在后台线程执行函数
functionanimateanimate(animation: Callable[[], Any], duration: float=..., delay_sec: float=..., completion: Optional[Callable[[], Any]]=...) -> None执行动画。按指定延迟执行动画回调,并在 duration 秒后执行 completion。注意:回调异步执行,适合轻量属性更新。
functionconvert_pointconvert_point(point: Any=..., from_view: Optional[View]=..., to_view: Optional[View]=...) -> Point坐标转换。from_view/to_view 为 None 表示窗口坐标系
functionconvert_rectconvert_rect(rect: Any=..., from_view: Optional[View]=..., to_view: Optional[View]=...) -> Rect矩形坐标转换
functionset_blend_modeset_blend_mode(mode: int) -> None设置绘图混合模式 (BLEND_* 常量)
functionset_shadowset_shadow(color: Optional[_ColorLike], offset_x: float, offset_y: float, blur_radius: float) -> None设置阴影。color 为 None 时清除阴影
classautoreleasepoolautoreleasepool()autoreleasepool 上下文(Python 中为 no-op)
functionload_viewload_view(name: Optional[str]=..., bindings: Optional[Dict[str, Any]]=..., stackframe: Any=..., verbose: bool=...) -> View加载 .pyui 文件。 name: 文件名(不含扩展名会自动加 .pyui) bindings: 名称到可调用对象的映射,用于绑定 action 等
functionload_view_strload_view_str(json_str: str, bindings: Optional[Dict[str, Any]]=..., stackframe: Any=..., verbose: bool=...) -> View从 JSON 字符串加载视图
functionclose_allclose_all(animated: bool=...) -> None关闭所有已展示的 UI 界面(Pythonista 兼容)
functiondump_viewdump_view(view: View, indent: int=...) -> None调试输出视图树(Pythonista 兼容)

#失败路径

情况应该怎么处理
页面空白确认已创建根 ui.View,设置了非零 frame,并调用 present(...)
点击无反应回调要赋函数对象,例如 button.action = tapped,不要写成 tapped()
布局错位检查 frameflex 和父视图尺寸;复杂响应式页面优先改用 appui
输入或列表状态难维护把新页面迁到 appui.StateFormListNavigationStack

#发布前检查

检查项合格标准
根视图有非零 frame,并设置清晰的 name 或标题。
子视图所有控件都已加入父视图,位置不依赖魔法数字之外的隐式状态。
回调action 传函数对象,不写成 action=handler()
布局横竖屏或不同窗口尺寸下,关键控件不会移出可见区域。
边界新功能不混用 uiappui 组件树。

#使用规则

  • 不要把 ui 组件和 appui 组件混在同一棵界面树里。
  • 需要响应式原生表单、列表或导航时优先选 appui。
  • ui 页面必须显式设置 frame/flex,并通过 present(...) 呈现。