LINUX.ORG.RU

Нужен ключ-GUI для навигации по календарям

 , , ,


0

2

Добрый день!

Есть календари, составленные на основе calendar (из пакета bsdmainutils), для которых необходим GUI для навигации по календарным датам и вывода календарных статей на выбранную дату из указанных календарей. Структура календарей не позволяет совершать поиск через cat в файлах, а только через выходную дату. Взял за основу zenity (либо yad; пока точно не определился, - где лучше получится...):

CAL=`calendar -t "$DATE" -A 0 -f /usr/share/calendar/ru_RU/calendar.common` \
DATE=`zenity --calendar \
   --text="Выберите дату" \
   --date-format="%y%m%d"` \
   && echo "$CAL"

На выходе (должен быть в zenity...) календарная дата на выбранный день открывается только после повторного ввода команды... Что сделал не так ?

Как после просмотра текущей даты/статьи вернуться снова к выбору даты или выбору календарного файла ?

P.S. Сам простой пользователь, вобщем, «старый чайник» без соответствующего образования.

Заранее благодарен !

Если я правильно понял, то у тебя для вычисления CAL иcпользуется переменная $DATE, которая появляется только после выполнения zenity.
Попробуй как-то так:

DATE=`zenity --calendar \
   --text="Выберите дату" \
   --date-format="%y%m%d"`
  
CAL=`calendar -t "$DATE" -A 0 -f /usr/share/calendar/ru_RU/calendar.common`

echo "$CAL"

Smola
()
Последнее исправление: Smola (всего исправлений: 1)
Ответ на: комментарий от Nugensovet

Я создал файл calend.sh, сделал его исполняемым chmod +x calend.sh, его содержимое:

#!/bin/bash

DATE=`zenity --calendar  --text="Выберите дату" --date-format="%y%m%d"`
CAL=`calendar -t $DATE -A 0 -f /usr/share/calendar/ru_RU/calendar.common`
echo "$CAL"

Запускаю:
$ ./calend.sh 
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
бер 08 	Alvan Clark born, 1804, astronomer & lens manufacturer
бер 08 	Howard Aiken born, 1900
бер 08 	Deaths of Denethor & Theoden
бер 08 	First Annual International Women's Day, 1909
бер 08 	International Women's Day in former USSR
бер 08 	Syrian National Day in Libyan Arab Republic
бер 08 	Women's Day in Guinea-Bissau, Taiwan and Yemen Democratic Republic
бер 08 	Youth Day in Zambia
бер 08 	Ron "Pigpen" McKernan (Grateful Dead) dies in California, 1973
бер 08 	(Louis) Hector Berlioz dies in Paris, 1869
бер 08 	Bonne fête aux Jean !
бер 08 	Quand en mars il tonne,
	L'année sera bonne.
бер 08 	Ausbruch der Revolution in Rußland, Abdankung von Zar Nikolaus II, 1917
бер 08 	(Louis) Hector Berlioz in Paris gestorben, 1869
бер 08 		Nõ nap - egy-egy szál virág a nõknek
бер 08 	Zoltán
бер 08 	Международный женский день
бер 08 	8 Березня - Міжнародний Жіночий День

У тебя так не работает?

Smola
()
Ответ на: комментарий от Nugensovet

Ну, не знаю. Вот еще версия с выводом календаря в окошко zenity (для выхода нажать отмену в окне выбора даты).

#!/bin/bash

while true; do

	DATE=`zenity --calendar  --text="Выберите дату" --date-format="%y%m%d"` || exit
	CAL=`calendar -t $DATE -A 0 -f /usr/share/calendar/ru_RU/calendar.common`
	echo "$CAL" | zenity --text-info

done

Smola
()
Ответ на: комментарий от Nugensovet

Smola, прошу прощения, работает. Туплю. Подумал запустить сам файл. Спасибо, большое !

Как после просмотра текущей даты/статьи вернуться снова к выбору даты или выбору календарного файла ?

Nugensovet
() автор топика
Ответ на: комментарий от Smola

Вот еще версия с выводом календаря в окошко zenity (для выхода нажать отмену в окне выбора даты).

Smola, отлично ! Спасибо ! То, что надо.

Как после просмотра текущей даты-статьи вернуться к выбору календарного файла ? Т.к. календарных файлов с десяток (у меня).

Nugensovet
() автор топика
Ответ на: комментарий от Nugensovet

Как-то так (не тестировал выбор другого файла):

#!/bin/bash

CAL_FILE="/usr/share/calendar/ru_RU/calendar.common"

while true; do

	DATE=`zenity --calendar  --text="Выберите дату" --date-format="%y%m%d"` || exit
	CAL=`calendar -t $DATE -A 0 -f $CAL_FILE`
	echo "$CAL" | zenity --text-info && echo Ok || CAL_FILE=`zenity --file-selection`

done

Отмена в окне с текстом — открывается диалог выбора файла.
Отмена в окне даты — выход из программы.

Smola
()
Последнее исправление: Smola (всего исправлений: 1)
Ответ на: комментарий от Nugensovet

Чтоб сразу открывался каталог, содержащий предыдущий файл календаря, изменить строку:

echo "$CAL" | zenity --text-info && echo Ok || CAL_FILE=`zenity --file-selection`
На
echo "$CAL" | zenity --text-info && echo Ok || CAL_FILE=`zenity --file-selection --filename=$CAL_FILE`

Smola
()
Ответ на: комментарий от Nugensovet
#!/bin/bash

CAL_DIR="/etc/calendar/" # Путь к каталогу с календарями
CAL_FILE="default"       # Имя календаря по умолчанию

while true; do

    echo "Using $CAL_DIR$CAL_FILE"
    DATE=`zenity --calendar --text="Выберите дату" --date-format="%y%m%d"` || exit
    CAL=`calendar -t $DATE -A 0 -f "$CAL_DIR$CAL_FILE"`
    echo "$CAL" | \
        zenity --text-info || \
        CAL_FILE=`zenity --list --radiolist  --title="Выберите календарь" \
            --column=""  --column="Имя календаря" \
            TRUE default \
            FALSE calendar.australia \
            FALSE calendar.birthday \
            FALSE calendar.christian \
            FALSE calendar.computer \
            FALSE calendar.croatian \
            FALSE calendar.dutch \
            FALSE calendar.freebsd \
            FALSE calendar.french \
            FALSE calendar.german \
            FALSE calendar.history \
            FALSE calendar.holiday \
            FALSE calendar.hungarian \
            FALSE calendar.judaic \
            FALSE calendar.lotr \
            FALSE calendar.music \
            FALSE calendar.newzealand \
            FALSE calendar.russian \
            FALSE calendar.southafrica \
            FALSE calendar.ukrainian \
            FALSE calendar.usholiday \
            FALSE calendar.world`

done
Smola
()
Последнее исправление: Smola (всего исправлений: 1)
Ответ на: комментарий от Smola

При первом выборе даты ничего не показывает, когда «Отменить» и выбираю этот же календарь, то показывает.

В CAL_FILE=«default» указан этот же календарь.

Nugensovet
() автор топика
Ответ на: комментарий от Smola
Using /usr/share/calendar/ru_RU/calendar.common
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.

Он обескуражен и требует переходного родителя :)

Но, пока не выберу календарь ничего не показывает.

Nugensovet
() автор топика
Ответ на: комментарий от Nugensovet

Не могу воспроизвести ошибку. У меня при задании любого календаря в 'CAL_FILE' он и открывается при первом запуске.
Вот версия, которая не забывает предыдущую дату:

#!/bin/bash

CAL_DIR="/etc/calendar/" # Путь к каталогу с календарями
CAL_FILE="default"       # Имя календаря по умолчанию

# Чтоб 'zenity --calendar' не ругался при первом запуске
DATE=`date "+%y%m%d"`

while true; do

    echo "Using $CAL_DIR$CAL_FILE"

    DATE=`zenity --calendar \
                 --text="Выберите дату" \
                 --year  ${DATE:0:2} \
                 --month ${DATE:2:2} \
                 --day   ${DATE:4:2} \
                 --date-format="%y%m%d"` || exit

    CAL=`calendar -t $DATE -A 0 -f "$CAL_DIR$CAL_FILE"`
    echo "$CAL" | \
        zenity --text-info || \
        CAL_FILE=`zenity --list --radiolist  --title="Выберите календарь" \
                         --column=""  --column="Имя календаря" \
                         TRUE default \
                         FALSE calendar.australia \
                         FALSE calendar.birthday \
                         FALSE calendar.christian \
                         FALSE calendar.world`

done

Smola
()
Ответ на: комментарий от Nugensovet

Smola, что-то не пойму...

Календарь то одну дату показывает, то три подряд, хотя выбираю только один. Может скопировал не так:

#!/bin/bash

CAL_DIR="/usr/share/calendar/ru_RU/"
CAL_FILE="/usr/share/calendar/ru_RU/calendar.common"

while true; do

    echo "Using $CAL_DIR$CAL_FILE"
    DATE=`zenity --calendar --text="Выберите дату" --date-format="%y%m%d"` || exit
    CAL=`calendar -t $DATE -A 0 -f "$CAL_DIR$CAL_FILE"`
    echo "$CAL" | \
        zenity --text-info || \
        CAL_FILE=`zenity --list --radiolist  --title="Выберите календарь" \
            --column=""  --column="Имя календаря" \
            TRUE calendar.common \
            FALSE calendar.medic \
            FALSE calendar.holiday \
            FALSE calendar.christian \
            FALSE calendar.military \
            FALSE calendar.birthday \
            FALSE calendar.world`

done

Nugensovet
() автор топика
Ответ на: комментарий от Nugensovet

CAL_FILE=«/usr/share/calendar/ru_RU/calendar.common»

Должно быть просто имя файла, т.е. «calendar.common», иначе при конкатенации строк (CAL_DIR + CAL_FILE) получится «/usr/share/calendar/ru_RU/usr/share/calendar/ru_RU/calendar.common».

Smola
()
Ответ на: комментарий от Smola

Сейчас все хорошо работает. Только с кнопками «Отменить» и «ОК» немножко несуразица, не сразу поймешь, как перейти в другой календарь.

Nugensovet
() автор топика
Ответ на: комментарий от Nugensovet

Исправил ошибку когда календарь менялся на дефолтный, если нажать «Отмену» в диалоге выбора календаря и добавил надписи на кнопках отмены.

#!/bin/bash

CAL_DIR="/etc/calendar/" # Путь к каталогу с календарями
CAL_FILE="calendar.birthday"       # Имя календаря по умолчанию

# Чтоб 'zenity --calendar' не ругался при первом запуске
DATE=`date "+%y%m%d"`

while true; do

    echo "Using $CAL_DIR$CAL_FILE"

    DATE=`zenity --calendar \
                 --text="Выберите дату" \
                 --year  ${DATE:0:2} \
                 --month ${DATE:2:2} \
                 --day   ${DATE:4:2} \
                 --date-format="%y%m%d" \
                 --cancel-label="Выход"` || exit

    CAL=`calendar -t $DATE -A 0 -f "$CAL_DIR$CAL_FILE"`
    echo "$CAL" | \
        zenity --text-info --cancel-label="Календари..." || \
        CAL_FILE=`zenity --list --radiolist  --title="Выберите календарь" \
                         --column=""  --column="Имя календаря" \
                         TRUE default \
                         FALSE calendar.australia \
                         FALSE calendar.birthday \
                         FALSE calendar.christian \
                         FALSE calendar.world \
                         || echo $CAL_FILE`

done

Smola
()
Ответ на: комментарий от Nugensovet

Берет подстроку из $DATE длиной 2, начиная c 0, 2 и 4 символа.

$ echo $DATE
160228
$ echo ${DATE:0:2}
16
$ echo ${DATE:2:2}
02
$ echo ${DATE:4:2}
28

Smola
()
Ответ на: комментарий от Smola

Отлично, спасибо ! Smola, пока все корректно работает...

Да, какую подсветку используете на выводе кода здесь ?

Nugensovet
() автор топика
Ответ на: комментарий от Smola

Smola, а как сделать вывод в текстовом поле масштабируемым ? Везде подставляю и не реагирует никак. Удалось поменять размеры только чекбокс с выбором файлов.

Nugensovet
() автор топика
Ответ на: комментарий от Nugensovet

Ширину и высоту окна можно задать параметрами --width и --hight, вот, например, я задал всем окнам zenity ширину 400:

#!/bin/bash

CAL_DIR="/etc/calendar/" # Путь к каталогу с календарями
CAL_FILE="calendar.birthday"       # Имя календаря по умолчанию

# Чтоб 'zenity --calendar' не ругался при первом запуске
DATE=`date "+%y%m%d"`

# Ширина окон zenity
WIN_WIDTH=400

while true; do

    echo "Using $CAL_DIR$CAL_FILE"

    DATE=`zenity --calendar \
                 --text="Выберите дату" \
                 --year  ${DATE:0:2} \
                 --month ${DATE:2:2} \
                 --day   ${DATE:4:2} \
                 --date-format="%y%m%d" \
                 --cancel-label="Выход" \
                 --width=$WIN_WIDTH` || exit

    CAL=`calendar -t $DATE -A 0 -f "$CAL_DIR$CAL_FILE"`
    echo "$CAL" | \
        zenity --text-info --cancel-label="Календари..." --width=$WIN_WIDTH || \
        CAL_FILE=`zenity --list --radiolist --width=$WIN_WIDTH \
                         --title="Выберите календарь" \
                         --column=""  --column="Имя календаря" \
                         TRUE default \
                         FALSE calendar.australia \
                         FALSE calendar.birthday \
                         FALSE calendar.christian \
                         FALSE calendar.world \
                         || echo $CAL_FILE`

done

Smola
()
Ответ на: комментарий от Smola

Раньше текст делил на отдельные строки так:

calendar -A 0 -f /usr/share/calendar/ru_RU/calendar.holiday | ~/.config/caja/scripts/Текст/Разделить_на_предложения.sed

Получалось так:

Снег - к весне затяжной, дождливой.
Оттепель - к раннему теплу.
Холод - к весне холодной.
Тепло и сухо - к неурожайному году.
Снег и холод - весна холодная, но не затяжная.
Если небо беззвездное, то зима поздно заплачет.
Снег метет через дорогу, - будет поздняя следующая зима, коли тихо, то ранняя.
Коли вьюга - к неурожаю хлеба.

Nugensovet
() автор топика
Ответ на: комментарий от Nugensovet

Ну, по идее и сейчас должно работать:

 Заменить

 CAL=`calendar -t $DATE -A 0 -f "$CAL_DIR$CAL_FILE"`

 на

 CAL=`calendar -t $DATE -A 0 -f "$CAL_DIR$CAL_FILE" | ~/.config/caja/scripts/Текст/Разделить_на_предложения.sed`

Протестировать, по понятным причинам, не могу.

Smola
()
Ответ на: комментарий от Nugensovet

Давайте тогда будем смотреть ~/.config/caja/scripts/Текст/Разделить_на_предложения.sed.
Отвечу уже завтра.

Smola
()
Ответ на: комментарий от Smola

Smola, снова прошу прощения. Я путь к скрипту внутри кавычек «» поставил, потому ошибка была. Теперь все правильно работает. Похоже я уже перегрелся и невнимателен, на сегодня пока все.

Еще раз, огромное спасибо !

Nugensovet
() автор топика
Ответ на: комментарий от Nugensovet

Важный фикс.
Как оказалось, zenity падает от числовых параметров с впередиидущими нулями, т.е. '01', '09' и т.п.

Было:
                 --year  ${DATE:0:2} \
                 --month ${DATE:2:2} \
                 --day   ${DATE:4:2} \

Стало:
                 --year  $((10#${DATE:0:2})) \
                 --month $((10#${DATE:2:2})) \
                 --day   $((10#${DATE:4:2})) \

Спокойной ночи!

Smola
()
Ответ на: комментарий от Smola

Доброго здоровья !

Smola, а если все сделать в одном окне, как-то так:

zenity --forms --title="Календари" --text="Выберите дату и календарный файл" \
   --add-calendar="" \
   --add-list="" \
   --list-values="" \
   --add-combo="" \
   --combo-values="calendar.common | calendar.holiday | calendar.world"
... можно календарь сделать сбоку - легче восприниматься будет.

Т.е. запускается (вместе с календарем) в текстовом поле дата из календарного файла по умолчанию и рядом чекбокс с возможностью выбрать другой файл. Наверное, это был был мини-шедевр на zenity.

Кстати, думаю заменить zenity на yad в календаре, - yad показывает еще номера недели.

Nugensovet
() автор топика
Ответ на: комментарий от Nugensovet

Да, как сделать, чтобы в чекбоксе были названия календарей, например:

"Гражданский календарь"
.., вместо
calendar.common
?

Nugensovet
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.