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

如何用Python curses-menu实现动态子菜单并将选中项传入函数

用curses-menu实现动态生成子菜单的方案

嘿,我刚好折腾过curses-menu的动态菜单需求,给你分享个亲测可行的实现思路和代码示例!

核心思路

curses-menu默认是静态定义菜单,但我们可以利用FunctionItem绑定自定义逻辑——选中菜单项时,先执行我们写的函数,在函数里完成「获取用户输入→生成动态子菜单→调用目标函数」的全流程,完美替代静态子菜单的方式。

完整代码示例

import curses
from curses_menu import Menu, FunctionItem, SelectionMenu

def target_function(selected_str):
    """你最终要传入参数的目标业务函数"""
    print(f"✅ 选中的字符串已传入目标函数: {selected_str}")
    # 这里替换成你的实际业务逻辑即可

def handle_dynamic_menu():
    # 1. 在curses环境内获取用户输入
    stdscr = curses.initscr()
    stdscr.clear()
    stdscr.addstr(0, 0, "请输入选项(多个选项用逗号分隔,按回车确认): ")
    stdscr.refresh()
    
    # 开启回显让用户看到输入,完成后关闭
    curses.echo()
    user_input = stdscr.getstr().decode("utf-8")
    curses.noecho()
    stdscr.clear()

    # 2. 处理输入生成选项列表
    if not user_input.strip():
        stdscr.addstr(0, 0, "❌ 输入不能为空!按任意键返回主菜单...")
        stdscr.getch()
        return
    
    # 支持单个选项或多个逗号分隔的选项
    options = [opt.strip() for opt in user_input.split(",")]

    # 3. 动态生成选择菜单并获取选中项
    selection_idx = SelectionMenu.get_selection(
        options, 
        title="请选择目标选项",
        subtitle="选中后会自动传入目标函数"
    )
    selected_str = options[selection_idx]

    # 4. 将选中字符串传入目标函数
    target_function(selected_str)

def main():
    # 创建主菜单
    main_menu = Menu(title="主菜单", subtitle="选中下方项生成动态子菜单")
    
    # 添加触发动态逻辑的菜单项
    dynamic_menu_item = FunctionItem("生成动态子菜单", handle_dynamic_menu)
    main_menu.append_item(dynamic_menu_item)
    
    # 显示主菜单
    main_menu.show()

if __name__ == "__main__":
    main()

关键部分拆解

  • 用FunctionItem作为入口:FunctionItem是curses-menu专为自定义逻辑设计的菜单项,选中它就会执行绑定的handle_dynamic_menu函数,这是实现动态逻辑的核心。
  • 在curses环境内获取输入:用curses原生的getstr()方法获取输入,避免跳出菜单的终端环境,同时通过curses.echo()控制输入回显,保证交互体验。
  • 灵活生成子菜单:这里用SelectionMenu.get_selection()快速生成选择菜单,如果你需要更复杂的子菜单(比如带更多功能项),也可以手动创建Menu对象,调用它的.show()方法即可。
  • 参数传递:拿到用户选中的字符串后,直接调用你的目标函数并传入参数,完美衔接业务逻辑。

扩展提示

  • 可以在输入环节添加验证逻辑,比如检查输入格式、长度,不符合要求就提示用户重新输入。
  • 如果需要多级动态菜单,只需在函数内嵌套创建菜单即可,逻辑和单级动态菜单一致。
  • 若要优化交互体验,可以在菜单中添加提示文本,或者用颜色标记选项(curses支持颜色配置)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:25:59