我正在尝试使用py-click构建一个交互式菜单。基本上只是一个结构:
我的代码:
import click
@click.group(invoke_without_command=True)
@click.pass_context
def main_group(ctx):
""" Lists all the submenu options available"""
cmds = main_group.list_commands(ctx)
click.echo(f"Available options:")
for idx, cmd_str in enumerate(cmds):
click.echo(f"{idx}:{cmd_str}")
click.echo(f"Now that you know all the options, let's make a selection:")
ctx.invoke(main_group.get_command(ctx, "selection"))
@main_group.command()
@click.option('--next_cmd', prompt='Next command:', help="Enter the number corresponding to the desired command")
@click.pass_context
def selection(ctx, next_cmd):
click.echo(f"You've selected {next_cmd}")
# check that selection is valid
# invoke the desired command
# return to parent previous command
@main_group.command()
def submenu_1():
click.echo('A submenu option ')
@main_group.command()
def submenu_2():
click.echo('Another option')
if __name__ == '__main__':
main_group()
但是,上述输出为:
Available options:
0:application-code
1:selection
2:submenu-1
3:submenu-2
Now that you know all the options, let's make a selection:
You've selected None
Process finished with exit code 0
基本上,选择命令的提示无效。但是选择命令本身是有效的,因为如果我直接运行它:
if __name__ == '__main__':
# main_group()
selection()
然后,实际上会提示我进行选择。所以为什么会忽略提示?或者,我构建此模型的方法背后的基本前提是否就是问题所在,例如,单击不适用于此
编辑: 通过查看大量使用此库的git repo,包括它们provide的示例,我没有找到任何构建与我想要的结构类似的结构。基本上,构建点击应用程序的范例似乎是一个独立的命令,它执行修改某事物状态的操作,而不是通过提供不同选项的菜单进行导航。不是说这是不可能的,但它似乎也没有得到开箱即用的支持
这个问题没有答案。我在这上面花了更多的时间。我在这方面取得了一点进展,但我仍然无法做到以下几点:
然后
等等。我的结论是,单击不是用于此的正确工具。事实上,我也不确定替代方案是否会使它变得更容易(argparse、docopt等)。也许要做到这一点,最好的方法就是自己构建一个类结构
或者,使用一种更接近shell或docker使用的方法,不需要任何菜单导航,只需启动作用于应用程序状态的原子命令
相关问题 更多 >
编程相关推荐