首页 > 解决方案 > Python Inquirer 模块:完成后删除选择(使用诅咒)

问题描述

注意:虽然我在 Inquirer 上提供了很多信息,但我很确定其中大部分都不会适用(只是为了安全)。对于我关于诅咒的实际问题,它在底部。

我在 Python 3 中使用 Inquirer 模块来允许用户从列表中选择一个值。我运行这个:

import inquirer    
choice = inquirer.prompt([inquirer.List("size",message="Which size do you need?",choices=["Large", "Medium", "Small"])

我得到了这个:

[?] What size do you need?: Medium
   Large
 > Medium
   Small

使用向上和向下键,我可以更改我的选择,然后按 Enter 进行选择,之后“选择”变量包含我选择的值。问题是:一旦选择完成,选择仍然显示。我想在完成后删除它们。我目前正在使用 ANSI 转义码在完成后从屏幕上删除选择,其中 x 是选择的数量:

import sys    
for i in range (x+1):
    sys.stdout.write('\x1b[1A')
    sys.stdout.write('\x1b[2K')

将打印的文本保留为:

[?] What size do you need?: Medium

问题是,ANSI 转义码不是通用的。我想使用适用于所有终端的解决方案,最好是curses,但curses对新用户不是很友好,所以我想知道是否有人知道如何使用curses“删除当前位置上方的x行”。谢谢!

标签: python-3.xpython-modulecursesinquirer

解决方案


curses,因此,会擦除整个显示(这可能不是你想要的)。低级别的 terminfo/termcap 方法似乎很有希望,但是虽然 ECMA-48 确实定义了一个序列(ED, 带有参数),它在当前位置上方1擦除,但没有与此相对应的预定义 terminfo/termcap 功能。所有你会发现那里有擦除到屏幕末尾或擦除整个屏幕的功能。

“ANSI 序列”是一个过时的术语。参考 ECMA-48,你可以做

sys.stdout.write('\x1b[1J')

将光标移动到您要删除的最后一个位置后。


推荐阅读