Модуль Python Inquirer: удаление вариантов после завершения (с использованием Curses) - PullRequest
0 голосов
/ 30 декабря 2018

ПРИМЕЧАНИЕ: хотя я даю много информации об Inquirer, я почти уверен, что большая часть информации не будет применяться (просто будучи в безопасности).Что касается моего реального вопроса о проклятиях, то он внизу.

Я использую модуль Inquirer в Python 3, чтобы позволить пользователю выбрать значение из списка.Я запускаю это:

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, чтобы выбрать, после того, каккоторая переменная "choice" содержит значение, которое я выбрал.Проблема заключается в следующем: после того, как выбор сделан, выбор все еще отображается.Я хочу удалить их, когда закончите.В настоящее время я использую Escape-коды 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 строк выше текущей позиции».Спасибо!

1 Ответ

0 голосов
/ 01 января 2019

curses , как таковой, сотрет весь экран (что, вероятно, не то, что вы хотите).Низкоуровневый подход terminfo / termcap может показаться многообещающим, но, хотя ECMA-48 определяет последовательность (ED, с параметром 1)который стирает выше текущей позиции, нет предопределенной возможности terminfo / termcap, которая соответствует этому.Все, что вы найдете, - это возможность стирания до конца экрана или стирания всего экрана.

«Последовательности ANSI» - это устаревший термин.Что касается ECMA-48, вы можете сделать

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

после перемещения курсора в последнее место, которое вы хотите стереть.

...