Создать диалоговое окно обратного отсчета для терминала Linux?

Как мне сделать диалоговый виджет для консоли Linux (не X, а «терминальной» консоли), который показывал бы обратный отсчет в секундах рядом с виджетом, который может быть списком меню или текстовым полем?

В идеале это может быть отдельная программа, такая как диалог, которому предоставляются параметры для управления его поведением.

Когда обратный отсчет достигает 0, возвращается выбранное значение виджета. Может быть значение по умолчанию, если нет человека (или человек предпочитает значение по умолчанию). Загрузчики, такие как grub и lilo, уже умеют это делать. Я просмотрел справочную страницу диалогового окна и не смог найти этот набор функций.

Пробовал до сих пор:

dialog --timeout 30 --menu 'Menu Title' 20 60 3 'A' 'Choose A' 'B' 'Choose B' 'C' 'Choose C' близко, но не показывает отсчет 30-секундного таймера.

dialog --pause 'Hurry!' 10 60 30 -- показывает сообщение и ok/cancel с запущенным таймером, но это только промежуточное объявление, а не ввод пользователя.

Можно объединить несколько строк следующим образом:

dialog --menu 'Menu Title' 10 60 3 'A' 'Choose A' 'B' 'Choose B' 'C' 'Choose C' --pause 'Hurry up' 10 60 30 

но при этом виджеты отображаются последовательно, а не объединены на одной странице. Здесь, после ответа на меню без таймера, вы получаете сообщение с таймером.


person Paul    schedule 26.08.2009    source источник


Ответы (3)


Я считаю, что Ncurses — это то, что вам нужно.

person Steve K    schedule 26.08.2009
comment
Спасибо за ответ. Чтобы закодировать это, я бы согласился. Я надеялся, что кто-то это уже сделал. - person Paul; 26.08.2009

Чтобы придерживаться использования диалога, я решил аналогичную проблему, разделив его на два диалоговых окна. Сначала появляется диалоговое окно со значением по умолчанию (и, возможно, альтернативными вариантами), отображаемыми на экране, и оно имеет таймер обратного отсчета. Пользователь может нажать esc или нажать «Отмена», чтобы изменить параметр, или же обратный отсчет достигнет 0, и программа продолжит работу с настройками по умолчанию. Если пользователь нажимает escape, появляется второе диалоговое окно, позволяющее редактировать параметры. Я не хотел добавлять дополнительное программное обеспечение в нашу пользовательскую сборку ОС deb-live / clonezilla, поэтому мне пришлось найти способ с помощью диалога.

dialog --title Some options to choose from, showing default --pause "\n\n Do you accept these options?:  \n  ${options_in_nice_format_for_display}" 20 60 5
[ $? -ne 0 ] && EDIT_IP=true || EDIT_IP=false

if ${EDIT_IP}; then
    dialog --editbox ${MY_OPTIONS_FILE} 20 60 2> ${EDITED_OPTIONS_FILE}
fi

Для еще лучшего решения (которое я использовал, но не хотел добавлять здесь лишний код) вы можете добавить цикл while, зависящий от логического значения, и разрешить повторение изменений до тех пор, пока пользователь не будет удовлетворен.

person JStrahl    schedule 13.12.2013

Я предлагаю вам прочитать dialog справочную страницу. О, вы уже сделали, вы говорите? Тогда что не так:

--pause высота текста ширина секунды

Поле паузы отображает счетчик вдоль нижней части поля. Счетчик показывает, сколько секунд осталось до окончания паузы. Пауза прекращается, когда истечет время ожидания, или пользователь нажмет кнопку OK (состояние OK), или пользователь нажмет кнопку CANCEL или клавишу Esc.

person Bombe    schedule 26.08.2009
comment
Спасибо, что обратили мое внимание на это. Однако пауза — это виджет, который отображает сообщение, обратный отсчет и кнопку «ОК/Отмена». Это не атрибут или модификатор других виджетов. Таким образом, он не будет реализовывать меню с обратным отсчетом. --timeout 30 добавит в меню 30-секундный тайм-аут, но индикатора прогресса не будет. - person Paul; 26.08.2009