Сайт | Скачать | Видео | Wiki

Автор Тема: Нужна помощь в написании скрипта GTKDialog + bash  (Прочитано 13588 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн oka-volga

  • Постоялец
  • ***
  • Сообщений: 149
  • Репутация: +3/-0
  • Автор темы
Прошу помощи у тех кто разбирается в GTKDialog и bash

История вопроса: http://forum.puppyrus.org/index.php/topic,15526.0.html

Не стал продолжать ту тему, пока, т.к. вопросы касаются программирования.
Возможно я бы не стал "заморачиваться", если бы кто нибудь изъявил желание написать данный скрипт с учетом моих пожеланий и , возможно, с учетом пожеланий других пользователей. Но т.к. желающих, пока, нет, попробую написать сам, конечно не без помощи.

Я не буду здесь писать полное ТЗ, которое существует только в моей голове, раз писать скрипт буду я, этого достаточно.
Скажу, так же, что писать буду с использованием GTKDialog (т.к. его XML структура мне близка и понятна) и bash (т.к. Си изучать не собираюсь, а bash знать необходимо)

То, что я уже "накорябал" прикреплю в виде файла.

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

Вопрос №1: При нажатии кнопки сохранить открывается диалог выбора файлов, при нажатии кнопки "ОК" Закрывается как диалог, так и основное, родительское окно, а нужно, что бы родительское окно осталось. Я там "прикрутил", дополнительную кнопку, идея такая - дефолтную кнопку убрать, а новая кнопка будет "убивать" текущее окно, но чё то не получается? Может как по другому надо? решил

Вопрос №2: В коде есть текстовое поле "find", для поиска по списку, как сделать так, что бы поиск работал сразу при вводе символа? решил: <action signal="key-press-event">echo "'$1' - key-press-event"</action>

Это пока основные, вопросы, если решим, будут ещё  :)
« Последнее редактирование: 10 Март 2014, 23:12:34 от oka-volga »
PuppyRus - 13.12

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
Вопрос №2: В коде есть текстовое поле "find", для поиска по списку, как сделать так, что бы поиск работал сразу при вводе символа?
Строка получения отфильтрованного списка
Код
curl $repo | tr [\<\>] " " | awk '/.pfs/ {print $3"  "$5"  "$7}' | grep "^$NAME" > $flist
переменная отсюда
Код
			<text>
<label>Find:</label>
</text>
<entry><variable>NAME</variable></entry>
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн oka-volga

  • Постоялец
  • ***
  • Сообщений: 149
  • Репутация: +3/-0
  • Автор темы
Вопрос №2: В коде есть текстовое поле "find", для поиска по списку, как сделать так, что бы поиск работал сразу при вводе символа?
Строка получения отфильтрованного списка
Код
curl $repo | tr [\<\>] " " | awk '/.pfs/ {print $3"  "$5"  "$7}' | grep "^$NAME" > $flist
переменная отсюда
Код
			<text>
<label>Find:</label>
</text>
<entry><variable>NAME</variable></entry>

Спасибо! Это я уже видел и понял как получить сразу отфильтрованный список, к сожалению, так не удобно.
Если коротко, нужно что бы работало так: считаем, что список уже есть. я ввожу любой символ, например "f" и в списке сразу же остаются строки содержащие символ "f", добавил еще символ - "fi", соответственно в списке остались строки содержащие "fi" и т.д.
А если удалить все символы из строки, показывается весь список. Вот так должно работать. В принципе функцию поиска по списку я наверное и сам осилю, хотя и от помощи не откажусь, а как сделать, что бы функция срабатывала при нажатии клавиши в поле ввода?
PuppyRus - 13.12

Оффлайн oka-volga

  • Постоялец
  • ***
  • Сообщений: 149
  • Репутация: +3/-0
  • Автор темы
BASH ооочень специфичный язык.
Порой элементарные операции не получаются. Я понимаю, что это из за моего недопонимания принципов bash.

Вот такой вопрос: В начале скрипта я объявляю глобальную переменную и присваиваю ей содержание файла
Код
export flist=repository.list
export myfile=`cat $flist`
Затем в определенной функции я хочу присвоить другое значение данной переменной
Код
my_function() {
     $myfile="Новое значение"
}

Но новое значение ни в какую не присваивается!!!
Проверяю
Код
printf "$myfile"
В терминале выводится старое значение переменной, присвоенное в самом начале, как мне "достучаться" до глобальной переменной и изменить ее значение?

Хотя у меня складывается впечатление, что я тут сам с собой веду беседу.
PuppyRus - 13.12

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
 А без export?
Код
flist=repository.list
myfile=`cat $flist`
Я в gtkdialog ничего не писал раньше из-за громоздкости, вот пробую.
Хотя у меня складывается впечатление, что я тут сам с собой веду беседу.
Не-е, наши мужики заместо баб до сих пор женский день отмечают. :D
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн oka-volga

  • Постоялец
  • ***
  • Сообщений: 149
  • Репутация: +3/-0
  • Автор темы
А без export?
Код
flist=repository.list
myfile=`cat $flist`

Проблема в том, что $myfile должен быть доступен нескольким функциям и если его не экспортировать, его из функции просто не видно!
Вы выложили свой вариант скрипта, где Вы используете два файла, а я считаю такой вариант не совсем верным, зачем записывать и перезаписывать второй файл, когда НУЖНО держать данные в переменной и уже с ней оперировать, это логичней, чем каждый раз обращаться к файлу.
Но пока не получается?! Вопрос почему?
PuppyRus - 13.12

Оффлайн midnighter

  • Ветеран
  • *****
  • Сообщений: 436
  • Репутация: +15/-0
Затем в определенной функции я хочу присвоить другое значение данной переменной
Код:
my_function() {
     $myfile="Новое значение"
}
Может так:
Код
myfile="Новое значение"

Оффлайн oka-volga

  • Постоялец
  • ***
  • Сообщений: 149
  • Репутация: +3/-0
  • Автор темы
Затем в определенной функции я хочу присвоить другое значение данной переменной
Код:
my_function() {
     $myfile="Новое значение"
}
Может так:
Код
myfile="Новое значение"

Да, так работает!  :) Как говорится: "Ларчик просто открывался"
PuppyRus - 13.12

Оффлайн oka-volga

  • Постоялец
  • ***
  • Сообщений: 149
  • Репутация: +3/-0
  • Автор темы
Вопросов, к сожалению, еще много!
Прикладываю последний вариант скрипта.

Вопрос вот какой: При загрузке скрипта отрабатывает все как надо, но если я выбираю другой репозиторий и нажимаю кнопку refresh,
список загружается и сохраняется в файле, как и задумано, так же обновляется значение переменной myfile

Список в форме формируется именно из переменной myfile. На кнопе refresh установлена команда: обновить список
Код
<action>refresh:LIST</action>
Но список не обновляется?!! В предыдущей версии список заполнялся прямо из файла и обновление списка прекрасно работало!
Теперь, когда я сделал заполнение списка из переменной, refresh не работает! В чем проблема?
« Последнее редактирование: 10 Март 2014, 17:37:24 от oka-volga »
PuppyRus - 13.12

Оффлайн midnighter

  • Ветеран
  • *****
  • Сообщений: 436
  • Репутация: +15/-0
Попробуй запустить так:
Код
bash -x ./my_script.sh
Может чего покажет?

Оффлайн oka-volga

  • Постоялец
  • ***
  • Сообщений: 149
  • Репутация: +3/-0
  • Автор темы
Попробуй запустить так:
Код
bash -x ./my_script.sh
Может чего покажет?

Мне ничего не показало :(

Вообще на обновление списка в коде две команды:
Код
<action>clear:LIST</action>
<action>refresh:LIST</action>

т.е. первая команда очищает список, а вторая обновляет, на самом деле работают обе команды, проверил убирая однну и оставляя другую. т.е. clear исправно чистит, а refresh обновляет, проблема в том, что не смотря на то, что скрипт обновил значение переменной, в список вставляются старые данные?!! Вероятно данные или как то кешируются или переменная не обновляется, или я чё то не так понимаю.
PuppyRus - 13.12

Оффлайн oka-volga

  • Постоялец
  • ***
  • Сообщений: 149
  • Репутация: +3/-0
  • Автор темы
Я решил не упорствовать сильно и немного отступить, в смысле сделать скрипт с использованием дополнительного временного файла.
За то первая полностью рабочая версия уже готова!  ;D ;D ;D

Конечно в ней нет защиты от дурака, нет информационных сообщений, нет прогресс бара при скачивании и сохранении модуля, недостаточно информации в списке модулей (я намерено упростил, пока), зато скрипт работает. Чему я безмерно рад!  ;D

PuppyRus - 13.12

Оффлайн oka-volga

  • Постоялец
  • ***
  • Сообщений: 149
  • Репутация: +3/-0
  • Автор темы
немного доработал, отличие только в том, что вместо списка модулей, таблица с дополнительной информацией.
PuppyRus - 13.12

Оффлайн DdShurick

  • Это Риччи
  • Активный участник
  • Ветеран
  • ****
  • Сообщений: 8635
  • Репутация: +187/-2
  • Старый чайник
 1) rm $flist не нужно, всё равно следующей строкой файл будет переписан.
 2) grep "$FIND" $flist > $ffind надо "^$FIND", привязать поиск к началу строки
 3) Две абсолютно одинаковых переменных $repo и $REPO, зачем?
 4) Второй строкой должна быть подпись автора (чтобы знать кого пинать)  :)
Моноблок Lenovo IdeaCentre c200 (Intel Atom D525, Intel GMA 3150, 2 Gb RAM) Richy64
Nettop Acer Aspire Revo R3610 (Atom N330, nVidia GeForce 9400, 3 Gb RAM) Richy64

Оффлайн oka-volga

  • Постоялец
  • ***
  • Сообщений: 149
  • Репутация: +3/-0
  • Автор темы
1) rm $flist не нужно, всё равно следующей строкой файл будет переписан.
 2) grep "$FIND" $flist > $ffind надо "^$FIND", привязать поиск к началу строки
 3) Две абсолютно одинаковых переменных $repo и $REPO, зачем?
 4) Второй строкой должна быть подпись автора (чтобы знать кого пинать)  :)

1. убрал rm $flist, действительно не нужен

2. "^$FIND", привязать поиск к началу строки не всегда это нужно, если пользователю нужно можно поставит "^" в начале строки в поле ввода. Например я хочу найти модуль с названием "pfs_get" (такого модуля в репозитории нет, пока, но в качестве примера наглядно). Просто я могу не помнить как точно называется модуль(sfs_get,pet_get,...), но точно знаю, что в нем присутствует "get", набрав в поиске "get" или лучше "_get" я просмотрю выведенный список модулей и найду тот, что мне нужен.

3. $repo и $REPO - это две совершенно разные переменные, в принцыпе я переназвал их одинаково, для красоты, но сути это не меняет, это две локальные переменные, созданные внутри разных функций и совершенно друг с другом не пересекающиеся. Так, что назвать их можно как угодно, в не зависимости друг от друга.

4. Подпись автора сделаю, раз надо кого то пинать :)
« Последнее редактирование: 12 Март 2014, 13:20:39 от oka-volga »
PuppyRus - 13.12