Автор Тема: shell скрипт zenity интерфейс  (Прочетена 4312 пъти)

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: shell скрипт zenity интерфейс
« Отговор #15 -: May 04, 2015, 17:51 »
Не се прави така прозорец с прогрес в zenity. Така, както си го направил в момента, създава нов прозорец за прогрес за всеки файл, което води до мигане на прозорци, липса на запълващ се прогрес и загуба на смисъла да го има. Промени реда, започващ с IFS, така:
Код
GeSHi (Bash):
  1. IFS=$'\n' image=( `$gui --file-selection  --multiple --separator=$'\n' --filename=$HOME/ --file-filter='Image Files (jpg,png,bmp) | *.jpg *.png *.bmp' --file-filter='All files | *' --title="Select an image files"` )
Целта на добавените скоби е да се докара масивът до стандартен shell масив, за да можем да броим стойностите му и така да си изчисляваме прогреса. Редактирал съм и title-а - поправена граматическа грешка и множествено число за съответствие с multiple-а.

След това замени целия for цикъл с това:
Код
GeSHi (Bash):
  1. step=$((100/${#image[@]}))
  2. pos=0
  3.  
  4. (
  5. for i in ${image[@]}; do
  6.    echo "# Current file:\n$i"
  7.    $converter -format $format -quality $scale -scale $resolution "$i"
  8.    pos=$(($pos+1))
  9.    echo $(($step*$pos))
  10. done
  11. ) | $gui --progress --percentage=0 --no-cancel --auto-close --title="Нещо за заглавие"
Текстът в прозорец с прогрес на zenity се сменя с echo, съдържащо символ # в началото на стринга. С това echo изписваме името на файла, който се обработва в момента. Позицията на прогреса се сменя с echo, съдържащо цифра за процента, на който прогресът трябва да се позиционира в дадения момент. Това echo трябва да съдържа само цифра и го слагаме след обработката на файла, за да отговаря на приключилата бройка файлове.
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

Rosen88

  • Напреднали
  • *****
  • Публикации: 172
  • Distribution: Calculate Linux Desktop 15.17
  • Window Manager: Mate 1.15
    • Профил
Re: shell скрипт zenity интерфейс
« Отговор #16 -: May 04, 2015, 18:12 »
Не се прави така прозорец с прогрес в zenity. Така, както си го направил в момента, създава нов прозорец за прогрес за всеки файл, което води до мигане на прозорци, липса на запълващ се прогрес и загуба на смисъла да го има. Промени реда, започващ с IFS, така:
Код
GeSHi (Bash):
  1. IFS=$'\n' image=( `$gui --file-selection  --multiple --separator=$'\n' --filename=$HOME/ --file-filter='Image Files (jpg,png,bmp) | *.jpg *.png *.bmp' --file-filter='All files | *' --title="Select an image files"` )
Целта на добавените скоби е да се докара масивът до стандартен shell масив, за да можем да броим стойностите му и така да си изчисляваме прогреса. Редактирал съм и title-а - поправена граматическа грешка и множествено число за съответствие с multiple-а.

След това замени целия for цикъл с това:
Код
GeSHi (Bash):
  1. step=$((100/${#image[@]}))
  2. pos=0
  3.  
  4. (
  5. for i in ${image[@]}; do
  6.    echo "# Current file:\n$i"
  7.    $converter -format $format -quality $scale -scale $resolution "$i"
  8.    pos=$(($pos+1))
  9.    echo $(($step*$pos))
  10. done
  11. ) | $gui --progress --percentage=0 --no-cancel --auto-close --title="Нещо за заглавие"
Текстът в прозорец с прогрес на zenity се сменя с echo, съдържащо символ # в началото на стринга. С това echo изписваме името на файла, който се обработва в момента. Позицията на прогреса се сменя с echo, съдържащо цифра за процента, на който прогресът трябва да се позиционира в дадения момент. Това echo трябва да съдържа само цифра и го слагаме след обработката на файла, за да отговаря на приключилата бройка файлове.

За граматическите грешки не споря с английския не съм добре :D. А за прогреса не бях сигурен как да го направя тук, въпреки че на друго място съм го правил по следния начин.

Код
GeSHi (Bash):
  1. detect () {
  2. # needs some time to register
  3. (
  4. echo "20" ; sleep 1
  5. echo "40" ; sleep 2
  6. echo "60" ; sleep 2
  7. echo "80" ; sleep 2
  8. echo "90" ; sleep 2
  9. DEVICE=$(dmesg| tail -n 1|grep removable|grep -o "\[sd*\]"|grep -o sd[a-z])
  10.  
  11. if [ "$DEVICE" = "" ]; then DEVTEXT="No device is detected"; else DEVTEXT="Detected new removable device /dev/$DEVICE"; fi
  12.  
  13. echo "# $DEVTEXT"
  14. ) |\
  15. $DIALOG --width=400 --height=200 --title="$TITLE" --progress --text="Waiting for device to register"
  16. #
  17. DEVICE=$(dmesg| tail -n 1|grep removable|grep -o "\[sd*\]"|grep -o sd[a-z])
  18. #
  19. if [ "$DEVICE" = "" ]; then
  20. #
  21. $DIALOG --title="Device not detected..." --question --ok-label="Try again" --cancel-label="Exit now" --text="No new usb device was detected..."
  22.  
  23. if [[ $? -eq 1 ]]; then
  24. exit 1
  25. else
  26. detect
  27. fi
  28. fi
  29. }
  30. detect
  31.  

Ако е нещо подобно ще се опитам да го запомня твоят метод тъй като изглежда по-прост.
Активен

Процесор: AMD Vishera FX8320 4600MHz Noctua NH-D14
Дънна Платка: Gigabyte GA-990-FXA UD3 Rev 4.0
Памет: 16GB DDR3 1600MHz Adata
SSD: AMD Radeon R7 SSD 120GB
HDD: Western Digital Red 1TB
Видео: Powercolor hd7870 ghz edition 2gb gddr5 (v2)
Захранване: Fractal Design Integra M650

Rosen88

  • Напреднали
  • *****
  • Публикации: 172
  • Distribution: Calculate Linux Desktop 15.17
  • Window Manager: Mate 1.15
    • Профил
Re: shell скрипт zenity интерфейс
« Отговор #17 -: May 04, 2015, 18:18 »
Струва ми се че сега нищо не прави освен броенето на прогрес. Ааа всъщност е презаписала имената вместо да създаде нови файлове. Това е една от спънките..

https://github.com/sandikata/ROKO__/blob/master/imagemagick-zenity

Много искам да ги понауча тези неща за да не те занимавам ама с английския като съм зле а и не мога да намеря свестен материал на български или поне руски...
« Последна редакция: May 04, 2015, 18:49 от Rosen88 »
Активен

Процесор: AMD Vishera FX8320 4600MHz Noctua NH-D14
Дънна Платка: Gigabyte GA-990-FXA UD3 Rev 4.0
Памет: 16GB DDR3 1600MHz Adata
SSD: AMD Radeon R7 SSD 120GB
HDD: Western Digital Red 1TB
Видео: Powercolor hd7870 ghz edition 2gb gddr5 (v2)
Захранване: Fractal Design Integra M650

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: shell скрипт zenity интерфейс
« Отговор #18 -: May 04, 2015, 19:01 »
Ааа всъщност е презаписала имената вместо да създаде нови файлове. Това е една от спънките..

По-нагоре ти бях обърнал внимание на това.
А наясно ли си, че ползвайки mogrify, вместо convert, ще имаш различен брой остатъчни файлове в зависимост от форматите на входния и изходния файл? При convert оригиналният файл остава наличен, докато резултатът се записва в друг файл. При mogrify резултатът ще се запише в друг файл, ако форматът на резултата е друг (например, входящ jpg файл, изходящ png файл), но ако форматите са еднакви (например, и входящият, и изходящият са jpg), то резултатът ще се запише върху оригинала. Няма по-добър или по-лош метод - зависи какво целиш.

П.П.: От примера, който си дал, не виждам каква е разликата между "моя" метод и "твоя" метод. Парче код, принтиращо числа за стойностите на прогреса, засилено към zenity. В този пример ти нямаш множество команди, които можеш да разграничиш в стъпки, с които да пълниш прогреса, а имаш единично действие, на което искаш да определиш максимално време за изпълнение, и това си се прави точно с поредица от sleep-ове, всеки от които е стъпка от прогреса. Е, аз бих вкарал sleep-овете и dmesg-а в цикъл, за да не ги пиша няколко пъти и за да проверявам dmesg-а след всеки sleep, за да не е нужно всеки път да се чака целия timeout, ако устройството е засечено по-рано, ама пак си зависи какво целиш.
А пък единично действие с неизвестно време за изпълнение, на което няма да се залага timeout и трябва да се изчака да приключи, се засилва към zenity с пулсиращ прогрес, тъй като няма нищо на стъпки, които да пълнят прогреса, а прозорецът трябва да остане отворен точно толкова време, колкото трае изпълнението на действието. Опитът за изкуствено създаване на стъпки в такива случаи води до некоректна информация за потребителя.
« Последна редакция: May 04, 2015, 20:20 от neter »
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Shell?
Настройка на програми
Cnupo 6 2032 Последна публикация Feb 06, 2004, 00:57
от SGM
shell
Настройка на програми
svetoslav 3 1854 Последна публикация Mar 21, 2004, 18:03
от
Shell-ove
Коментар
investor 5 1964 Последна публикация Feb 10, 2006, 21:22
от investor
Dc++ клиент за shell
Настройка на програми
FuckBTK 0 899 Последна публикация Apr 19, 2006, 09:50
от FuckBTK
Shell картинка
Настройка на програми
Hanibal 0 990 Последна публикация Jan 08, 2007, 00:35
от Hanibal