我正在尝试使用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,我一直找不到能够构建出与我想要的结构类似的结构的任何git repo。基本上,构建单击应用程序的范例似乎是隔离的命令,该命令执行的操作会更改某些内容的状态,而不是通过提供不同选项的菜单进行导航。并不是说这是不可能的,但似乎也不是立即可用的。
答案 0 :(得分:0)
此问题没有答案。我花了更多时间在此上。我在这方面取得了一些进展,但仍然无法完成以下操作:
Main Menu
- Option 1
- Option 2
- Option 3
- Submenu 1
然后
Submenu 1
- Option 1
- Option 2
- Submenu 2
- Back to Main
等我的结论是,点击并不是用于此目的的正确工具。实际上,我不确定替代方案是否一定会使它容易得多(argparse,docopt等)。也许这样做的最好方法就是自己构建一个类结构。
或者,然后,采用一种更接近于shell或docker使用的方法,不要理会任何菜单导航,而只是启动对应用程序状态起作用的原子命令。