You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python Textual库实现分步选项屏幕的线性切换?

使用Textual实现分步选项列表的屏幕切换

要实现分步选项的界面切换,你需要用Textual的Screen组件来管理不同的步骤界面,而非原来的Static。以下是修改后的完整代码及关键说明:

关键修改点

  • 替换Static为Screen:Screen是Textual专门用于独立界面切换的核心组件,每个步骤对应一个Screen实例
  • 实现屏幕切换逻辑:在选项选择事件中,通过self.app.replace_screen()或self.app.push_screen()切换到下一个步骤
  • 跨Screen共享数据:通过App实例的属性传递不同步骤的选择结果

完整代码

from textual.app import App, ComposeResult, Screen
from textual.widgets import Footer, Header, OptionList
from textual import on

class SelectType(Screen):
    def compose(self) -> ComposeResult:
        yield Header(title="想买什么?")
        yield Footer()
        yield OptionList("Car", "Bike", id="type-select")

    @on(OptionList.OptionSelected)
    def on_type_selected(self, event: OptionList.OptionSelected) -> None:
        # 记录用户选择的交通工具类型
        self.app.selected_type = event.option.label
        # 切换到电动选项屏幕
        self.app.replace_screen(SelectElectric())

class SelectElectric(Screen):
    def compose(self) -> ComposeResult:
        yield Header(title=f"是否电动?(已选:{self.app.selected_type})")
        yield Footer()
        yield OptionList("Yes", "No", id="electric-select")

    @on(OptionList.OptionSelected)
    def on_electric_selected(self, event: OptionList.OptionSelected) -> None:
        # 处理最终选择结果,这里示例为退出程序并返回结果
        final_result = f"已确认:{self.app.selected_type},电动选项:{event.option.label}"
        self.app.exit(final_result)

class MainProgram(App[None]):
    # 用于跨Screen共享选择数据的属性
    selected_type: str = ""

    def on_mount(self) -> None:
        # App挂载后加载第一个选择屏幕
        self.push_screen(SelectType())

if __name__ == "__main__":
    app = MainProgram()
    result = app.run()
    print(result)

额外说明

  • 如果需要支持返回上一步,将replace_screen改为push_screen,并可添加回调函数处理返回值:
    # 在SelectType中使用push_screen并添加回调
    self.app.push_screen(SelectElectric(), callback=self.on_electric_result)
    
    # 新增回调函数处理返回的电动选项
    def on_electric_result(self, electric_option: str) -> None:
        print(f"返回的电动选项:{electric_option}")
        # 可在此处返回上一步或继续流程
    
  • 每个Screen可以独立定义自己的Header、Footer和组件,保持界面的独立性

内容的提问来源于stack exchange,提问作者frans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 14:16:21