如何用Python 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
相关产品推荐
相关产品推荐

