Запросить подтверждение пользователя перед выполнением скрипта?

Есть ли способ получить диалоговое окно типа User Confirmation (Like Are You Sure-Yes / No) при выполнении скрипта (двойным щелчком мыши)? Я не имею в виду в терминале, но окно с графическим подтверждением, что-то вроде этого:

(я знаю, что изображение из окон, я не мог найти Linux)

1
задан 21 February 2016 в 17:19

3 ответа

Вы можете использовать xmessage в самом скрипте. Поместите что-то подобное после «shebang»:

xmessage "Are you sure?"

На нем появится графическое сообщение с надписью «Вы уверены?». с кнопкой «okay».

Вы можете настроить xmessage на наличие более одной кнопки и изменить то, что написано в ней. Вы также можете настроить действия, выполняемые каждой кнопкой.

Например,

xmessage -buttons ok:0,cancel:1 "Are you sure?"  

См. man xmessage для всех параметров (их много).

6
ответ дан 23 May 2018 в 13:23
  • 1
    Спасибо ... Это решение также отлично работает. Просто zenity отображает более удобный диалог. С точки зрения функциональности, оба работают ... – mayank budhwani 20 February 2016 в 19:59

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

TL; DR - Не изменяйте свой скрипт. Вместо этого настройте свой файловый менеджер или выясните, почему ваши пользователи случайно запускают его.

EDIT: Кажется, вы считаете свой сценарий как-то особенным, как будто общие настройки недостаточно хороши, и ваш скрипт нуждается в специальном подтверждении от Пользователь. Двойной щелчок по нему TL; DR - Не изменяйте свой скрипт. Вместо этого настройте свой файловый менеджер или выясните, почему ваши пользователи случайно запускают его. подтверждение. Если вы обнаружите, что ваши пользователи запускают его случайно, тогда вам нужно выяснить, почему они это делают и решить это. Тогда ваша реальная проблема заключается не в том, как требовать подтверждения, а в том, как предотвратить случайное использование ваших пользователей.

По тому, как вы раскрываете свою проблему, кажется, что вы ожидаете, что ваша программа (сценарий) будет запущена путем навигации где находится файл, а затем щелкнуть по нему из диспетчера файлов. Подумайте обо всех других программах в вашей системе. Как много вы начинаете? Вы переходите к /usr/local/bin при запуске firefox? Конечно, нет. Вы нажимаете на нее в меню приложений. (gnome tweak - скрипт python, может быть, это лучший пример)

Надеюсь, вы не будете нажимать на него из меню приложений случайно. Поэтому ваша проблема заключается в том, как заставить вас запускать скрипт вместо использования диспетчера файлов. Для этого выполните следующие действия:

поместите сценарий из других файлов, где пользователь может случайно щелкнуть по нему (типичное место - /usr/local/bin/ для системной установки или ~/.local/bin/ для установки пользователем), создайте файл записи рабочего стола (прочтите стандартные спецификации). Вот минимальный случай:
[Desktop Entry]
Name=Your script name
Exec=path/for/your/script
Icon=path/for/your/icon/can/be/svg
Terminal=false
Type=Application
и засуньте его в /usr/local/share/applications/your-script.xml или ~/.local/share/your-script.xml. Наконец запустите update-desktop-database.

Поскольку вы дважды щелкаете по скрипту, это подтверждается его файловым менеджером. Это не значит, что сценарий должен подтвердить, должен ли он работать. Примите это к крайности. Можете ли вы представить себе, насколько смешно было бы, что каждый раз, когда вы вызывали какую-либо программу, которую вы должны были подтвердить?

Единственный момент, когда программа должна запрашивать подтверждение, - это когда она собирается сделать что-то опасное и необратимое , Например, перезапись файла или обход мусора. И обратите внимание, что даже эти примеры связаны с тем, что программа делает что-то конкретное. Они не собираются начинать такие программы. Если целью программы является только такая опасная вещь, то она также не должна запрашивать подтверждение.

Действительно, Nautilus (менеджер файлов Gnome) уже по умолчанию попросит вас подтвердить, хотите ли вы выполнить сценарий (или просто открыть его в текстовом редакторе).

И, конечно, это поведение настраивается, предоставляя пользователю возможность отключить его (запись примечания на not ).

Так что не добавляйте раздражающее диалоговое окно подтверждения в ваш скрипт. Настройте свой файловый менеджер правильно. И пусть ваши пользователи делают то же самое.

5
ответ дан 23 May 2018 в 13:23
  • 1
    На самом деле это не решение, так как это невозможно легко и безопасно передать другим. – Ismael Miguel 21 February 2016 в 05:14
  • 2
    Спасибо ... Я знаю, как это сделать. Но это добавляет подтверждение всем скриптам ... Я хочу, чтобы это было для конкретного скрипта ... – mayank budhwani 21 February 2016 в 05:51
  • 3
    @IsmaelMiguel, но в этом весь смысл ответа. Он не должен использоваться. Есть две разные вещи: действие программы и поведение / опыт системы. Вы не должны сливать их. – carandraug 21 February 2016 в 15:44
  • 4
    @IsmaelMiguel этот ответ указывает на анти-шаблон того, что пользователь хочет делать. Это не дает рыбе спросить, потому что у него аллергия. – Braiam 21 February 2016 в 17:21
  • 5
    @mayankbudhwani вы все еще решаете неправильную проблему. Почему этот специальный скрипт особенный? Если ваши пользователи нажимают на него случайно, это другая проблема. Я отредактировал ответ другим путем. – carandraug 21 February 2016 в 19:43

Вы можете использовать yad, который похож на zenity на стероиды, поскольку он намного более настраивается. Вы можете установить его из Software Center в Ubuntu. В своей основной форме вы можете ввести

yad --title=Question --image=dialog-question --text="Are you sure?"

, и вы должны увидеть это:

Если было нажато OK, мы получаем код возврата 0 , если был нажат «Отмена», мы получаем код возврата 1.

. Лучше поместить ящик в центр, а также отрегулировать его ширину, используя ведущую вкладку для размещения текста «Вы конечно?" больше вправо, а также всегда на высоте. Для этого нам нужно:

yad --center --on-top --title=Question --image=dialog-question --text="\tAre you sure?" --width 200

Большинство переключателей самоочевидны, за исключением «\ t» перед «Вы уверены?». который просто добавляет вкладку перед печатью текста. Теперь мы должны увидеть это:

Ящик центрирован, всегда сверху и выглядит лучше. Чтобы установить переменную для проверки, для которой была нажата кнопка, используйте:

yad --center --on-top --title=Question --image=dialog-question --text="\tAre you sure?" --width 200;result=$?;echo $result

В этом примере мы используем переменную $ result, которая будет установлена ​​в 0, если OK нажата или 1, если было нажато «Отмена».

Для помощи с yad вы можете использовать man yad или yad --help-all, но я нашел, что практические примеры легче адаптировать. Здесь есть некоторые. Яд гораздо более настраиваемый и, следовательно, более полезный, чем зенит, по моему мнению.

2
ответ дан 23 May 2018 в 13:23

Другие вопросы по тегам:

Похожие вопросы: