Написание скриптов с графическим интерфейсом ч.2

Ранее уже рассматривалась тема создания скриптов с графическим интерфейсом на базе утилиты kdialog, являющейся частью KDE. Но пользователям сред на базе GTK+ не всегда есть смысл устанавливать библиотеки KDE и потому им можно порекомендовать различные альтернативы на базе GTK+. Ниже будет рассмотрена одна из таких альтернатив — Zenity.

Zenity есть в большинстве современных дистрибутивов. Если же нет — его не сложно установить. Например в Debian/Ubuntu это делается командой:

apt-get install zenity

Впринципе для того чтобы разобраться с zenity вполне достаточно чтения man-страницы, однако всё же рассмотрим применение zenity на примере задач из предыдущей статьи.

Задача #1: скрипт для перекодирования файлов

Тут тоже ничего сложного, нам нужно запросить имя входного файла, имя выходного файла и кодировку входного файла. Опять же переходим сразу к готовму скрипту:

#!/bin/sh

# Получаем имя исходного файла
SRCFILENAME=`zenity --file-selection --title='Выберите файл, который надо перекодировать'`

# Если имя файла не пустое идём дальше
if ! [ -z ${SRCFILENAME} ]; then

    # Получаем имя конечного файла
    DSTFILENAME=`zenity --file-selection --save --confirm-overwrite --title='Выберите имя перекодированного файла'`

    # Если имя файла не пустое идём дальше
    if ! [ -z ${DSTFILENAME} ]; then

        # Если конечный и начальный файл один и тот же -
    	# Завершаем скрипт с сообщением об ошибке
        if [ ${SRCFILENAME} = ${DSTFILENAME} ]; then
    	    zenity --error --text='Нельзя перекодировать файл сам в себя!'
	    exit 1
        fi

    	# Запрашиваем кодировку исходного файла
        # Список доступных кодировок получается из вывода команды iconv -l
        ENCODING=`iconv -l | sed 's/\/\///'| awk '{ print $1;}'|sort |zenity --list --column='Кодировка' --text='Выберите кодировку исходного файла' --title='Выбор кодировки'`

        # Если кодировка выбрана - перекодируем файл и сообщаем об
        # успешном завершении скрипта
        if ! [ -z ${ENCODING} ]; then
            iconv -f ${ENCODING} -t utf-8 ${SRCFILENAME} > ${DSTFILENAME}
            zenity --info --text='Перекодирование выполнено!'

        fi

    fi

fi

Видно, что скрипт получился достаточно простой, так что можно перейти к следующей задаче.

Задача #2: Проверка доступности сетевого ресурса.

Задача: периодически проверять доступность сетевого ресурса и уведомлять пользователя о его пропадании и последующем появлении. Тут нужно организовать вечный цикл и внутри него проверять доступность/недоступность ресурса. Скрипт будет выглядеть примерно вот так:

#!/bin/sh

# Ресурс, доступность которого нужно проверять.
PINGRESOURCE="ylsoftware.com"

# Файл, который будет создаваться если ресурс недоступен
LOCKFILE="/tmp/${PINGRESOURCE}.lock"

# Интервал (в секундах) между проверками
CHECKTIME=60

# Организуем бесконечный цикл
while true; do

    # Если ресурс не доступен
    if (! ping -c 3 ${PINGRESOURCE} > /dev/null 2> /dev/null) then

        # Проверяем наличие временного файла
	if (! test -f ${LOCKFILE}) then
    	    # Если временный файл не существует - создаём его
            # и оповещаем пользователя
	    touch ${LOCKFILE}
    	    zenity --error --text='Ресурс недоступен!'
        fi

        # Если же доступен
    else
        # Проверяем наличие временного файл
        if (test -f ${LOCKFILE}) then

            # Если файл существует - удаляем его и оповещаем
            # Пользователя о доступности
            rm ${LOCKFILE}
            zenity --info --text='Ресурс доступен!'
        fi
    fi

    sleep ${CHECKTIME}
done

Дополнительные комментарии тут излишни. Как уже говорилось выше — более подробную информацию желающие могут подчерпнуть из man-страницы zenity.

Приятной работы!

Мне понравилась эта заметка:
Другое:
Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>