Титла: shell скрипт zenity интерфейс Публикувано от: Rosen88 в May 02, 2015, 12:47 Здрасти!
Не съм много сигурен а и не мога да намеря информация, или аз не търся добре та.. Пиша една програмка на шел като искам да добавя zenity графичен интерфейс. Тъй като не видях да има вариант на прогрес бар да пита при натискане на Cancel а вместо това директно затваря, има ли някакъв елементарен начин да се направи диалог при Cancel При проверка.. Код: roko__@GA990-FXA-UD3_FX8320 [ 12:46:11 ] [ 05/02/15 ] [ pts/2 ] ~/Програмиране % zenity --progress ;echo $? Cancel дава exit 1 но преди изпълнение на exit 1 ми трябва да има диалогов прозорец за потвърждаване. Титла: Re: shell скрипт zenity интерфейс Публикувано от: Rosen88 в May 02, 2015, 19:26 Мисля че намерих начин на този етап.
https://github.com/sandikata/ROKO__/blob/master/app-text/sprunge/files/sprunge Титла: Re: shell скрипт zenity интерфейс Публикувано от: neter в May 02, 2015, 19:33 Така и така тръгнах да пиша този отговор, та поне да си го довърша :)
Няма функционалност в zenity за допълнително потвърждаване на action бутоните му, така че няма да минеш без затваряне на прозореца с прогреса. Решението е да си запазваш текущата стойност на прогреса, след това при затваряне на прозореца с прогреса да отваряш нов прозорец, в който да питаш за потвърждение, и ако потребителят реши да продължи (т.е., ако откаже прекъсването), да отваряш нов прозорец с прогрес, продължавайки от запазената стойност на предишния прогрес. Ето един вариант за това: Код
Трябва да си добавиш командите в съответните стъпки и да си добавиш надписи в прогреса за различните стъпки, ако са ти нужни. Титла: Re: shell скрипт zenity интерфейс Публикувано от: Rosen88 в May 02, 2015, 21:50 Аз бях пробвал със while цикъл но се отказах, много се усложнява. Сега имам друг пржблем който ме спъва да си допиша интерфейса.
Код
Но тук проблема е с relative path You selected /home/roko__/Снимок экрана от 2015-02-16 17:49:27.png /home/roko__/Снимок экрана от 2015-02-17 09:45:04.png. Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. You selected jpg. Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. You selected 85%. Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. You selected 1680x1050. mogrify: unable to open image `/home/roko__/Снимок': Нет такого файла или каталога @ error/blob.c/OpenBlob/2701. mogrify: unable to open image `экрана': Нет такого файла или каталога @ error/blob.c/OpenBlob/2701. mogrify: unable to open image `от': Нет такого файла или каталога @ error/blob.c/OpenBlob/2701. mogrify: unable to open image `2015-02-16': Нет такого файла или каталога @ error/blob.c/OpenBlob/2701. mogrify: no decode delegate for this image format `49' @ error/constitute.c/ReadImage/501. mogrify: unable to open image `/home/roko__/Снимок': Нет такого файла или каталога @ error/blob.c/OpenBlob/2701. mogrify: unable to open image `экрана': Нет такого файла или каталога @ error/blob.c/OpenBlob/2701. mogrify: unable to open image `от': Нет такого файла или каталога @ error/blob.c/OpenBlob/2701. mogrify: unable to open image `2015-02-17': Нет такого файла или каталога @ error/blob.c/OpenBlob/2701. mogrify: no decode delegate for this image format `45' @ error/constitute.c/ReadImage/501. И не мога да намеря решение, или поне не ми идва на ум как да реша проблема. Титла: Re: shell скрипт zenity интерфейс Публикувано от: neter в May 03, 2015, 01:01 От грешката не виждам проблем с относителни пътища, а проблем, дължащ се на интервалите в името на файла. На ред 46 от скрипта си огради променливата $image в двойни кавички, за да се възприема стойността ѝ като цялостен низ и да бъде подадено коректно име на файла, който да се обработи от mogrify.
Титла: Re: shell скрипт zenity интерфейс Публикувано от: Rosen88 в May 03, 2015, 07:26 От грешката не виждам проблем с относителни пътища, а проблем, дължащ се на интервалите в името на файла. На ред 46 от скрипта си огради променливата $image в двойни кавички, за да се възприема стойността ѝ като цялостен низ и да бъде подадено коректно име на файла, който да се обработи от mogrify. Иначе останалия код може ли да се подобри или това е максимума ? You selected /home/roko__/Снимок экрана от 2015-02-16 17:49:27.png /home/roko__/Снимок экрана от 2015-02-17 09:45:04.png. Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. You selected jpg. Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. You selected 90%. Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. You selected 1680x1050. mogrify: no decode delegate for this image format `49' @ error/constitute.c/ReadImage/501. Появява се някакъв друг проблем. Ако изпълня същия синтаксис в терминала няма проблем. Но тук изкарва нова изненада. Проблема е че като ги оградя ги възприема като интервали а в терминала на тези интервали има Снимка\ от\ дата\ месец\ година.png Титла: Re: shell скрипт zenity интерфейс Публикувано от: neter в May 03, 2015, 14:04 Дефинирай "подобри"! Аз го считам за твърде субективен термин и не мога да го коментирам обективно.
Целта на ограждането на променливата $image в двойни кавички е точно, за да се избегнат проблеми с интервали и някои специални символи. Ефектът с наклонените черти е подобен, а за mogrify няма значение как ще се направи, стига в крайна сметка да получи точното име на файла. Вместо двойните кавички може да си поиграеш да добавяш наклонени черти в стойността на променливата $image пред всички интервали и специални символи (в примерния ти файл има двоеточия, които също биха се нуждаели от наклонени черти пред тях). Ти си прецени кое е по-добро за теб. Изпробвах ползването на кавички в скрипта за променливата $image, няма проблем, работи си, така че явно ти не си направил нещо както трябва. И тъй като забелязах, че в твоя скрипт имаш излишен интервал зад променливата $image и гледайки грешката ти, оставам с впечатлението, че си вкарал този интервал в кавичките, а това е проблем. В кавички трябва да оградиш единствено и само променливата $image Код
А наясно ли си, че ползвайки mogrify, вместо convert, ще имаш различен брой остатъчни файлове в зависимост от форматите на входния и изходния файл? При convert оригиналният файл остава наличен, докато резултатът се записва в друг файл. При mogrify резултатът ще се запише в друг файл, ако форматът на резултата е друг (например, входящ jpg файл, изходящ png файл), но ако форматите са еднакви (например, и входящият, и изходящият са jpg), то резултатът ще се запише върху оригинала. Няма по-добър или по-лош метод - зависи какво целиш. Титла: Re: shell скрипт zenity интерфейс Публикувано от: Rosen88 в May 03, 2015, 15:09 Дефинирай "подобри"! Аз го считам за твърде субективен термин и не мога да го коментирам обективно. Дефинирай "подобри"! Аз го считам за твърде субективен термин и не мога да го коментирам обективно. Нещо не мога да се ориентирам къде има интервал ? Титла: Re: shell скрипт zenity интерфейс Публикувано от: Rosen88 в May 03, 2015, 15:11 Код
Сложих кавичките само на $image You selected /home/roko__/Снимок экрана от 2015-02-16 17:49:27.png /home/roko__/Снимок экрана от 2015-02-17 09:45:04.png. Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. You selected jpg. Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. You selected 85%. Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. You selected 1680x1050. mogrify: no decode delegate for this image format `49' @ error/constitute.c/ReadImage/501. Титла: Re: shell скрипт zenity интерфейс Публикувано от: Rosen88 в May 03, 2015, 16:32 Всъщност... Проблема идва при повече от 1 файл. Imagemagic не иска да ги разпознава ако изглеждат така.
/home/roko__/Снимок экрана от 2015-02-16 17:49:27.png /home/roko__/Снимок экрана от 2015-02-17 09:45:04.png /home/roko__/Снимок экрана от 2015-02-18 00:28:00.png /home/roko__/Снимок экрана от 2015-02-18 08:54:39.png Но ако избраните от file-select файлове могат да се представят в шел скрипта като /home/user/*.png тогава няма проблем. Знам че питам за нещо което би било трудно приложимо. Нали да работи по този начин само за избраните файлове от file-select а не да накърти всички файлове със зададено разширение в директорията. Титла: Re: shell скрипт zenity интерфейс Публикувано от: neter в May 04, 2015, 14:18 Ааа, не съм видял, че ползваш multiple в избора на файлове. В такъв случай трябва да вкараш имената на файловете в масив, с което хем ще получиш добро разделение на имената, хем удобно ще ги засилваш един по един към mogrify, тъй като той поддържа подаване на само 1 файл наведнъж. За целта в твоя скрипт замени ред 6 с това:
Код и замени ред 46 с това: Код В първата заменка указваме разделителят на файловете да е нов ред, а във втората заменка обхождаме масива и изпълняваме mogrify за всеки от елементите му. Намирам за много подходящо, ако добавиш zenity прозорец с прогрес при обхождането на масива, за да не се чуди потребителят до кой файл се е стигнало в обработката при множество файлове. Е, пак се опира до въпроса от началото на темата, но той вече е изяснен :) Титла: Re: shell скрипт zenity интерфейс Публикувано от: Rosen88 в May 04, 2015, 15:20 Ааа, не съм видял, че ползваш multiple в избора на файлове. В такъв случай трябва да вкараш имената на файловете в масив, с което хем ще получиш добро разделение на имената, хем удобно ще ги засилваш един по един към mogrify, тъй като той поддържа подаване на само 1 файл наведнъж. За целта в твоя скрипт замени ред 6 с това: А тази променлива IFS ? Иначе направих въпросните промени иии. roko__@GA990-FXA-UD3_FX8320 [ 15:18:31 ] [ 05/04/15 ] [ pts/2 ] ~/Програмиране % ./imagemagick-backend Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. /home/roko__/png/Fractal_Nineteenteen_by_Drumbtr.png\n/home/roko__/png/ILTQq.png\n/home/roko__/png/Qsbbfie.png\n/home/roko__/png/sparks-wallpaper.png\n/home/roko__/png/square-pattern-1080p.png Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. jpg Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. 85 Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged. 1680x1050 convert: unable to open image `85': Нет такого файла или каталога @ error/blob.c/OpenBlob/2701. convert: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501. convert: no images defined `/home/roko__/png/Fractal_Nineteenteen_by_Drumbtr.png\n/home/roko__/png/ILTQq.png\n/home/roko__/png/Qsbbfie.png\n/home/roko__/png/sparks-wallpaper.png\n/home/roko__/png/square-pattern-1080p.png' @ error/convert.c/ConvertImageCommand/3210. 1 roko__@GA990-FXA-UD3_FX8320 [ 15:18:42 ] [ 05/04/15 ] [ pts/2 ] ~/Програмиране % :( Титла: Re: shell скрипт zenity интерфейс Публикувано от: neter в May 04, 2015, 15:44 Иначе направих въпросните промени иии.Грешката говори, че не си ги направил така, както ти показах. Предполагам, че си пропуснал един знак за долар при separator-а и/или задаването на IFS. IFS е променлива, указваща на bash какво да използва за разделител на низовете. По подразбиране е бели полета (интервал, табулация и нов ред). В случая указваме за разделител да се счита само нов ред. Така, попълвайки файловете в масива в отделни редове, благодарение на separator-а в zenity, в масива $image интервалите в имената на файловете не се считат за край на името на файла и имаме коректен списък от имена на файлове. Ама за тези неща има документация :) Титла: Re: shell скрипт zenity интерфейс Публикувано от: Rosen88 в May 04, 2015, 16:05 Иначе направих въпросните промени иии.Грешката говори, че не си ги направил така, както ти показах. Предполагам, че си пропуснал един знак за долар при separator-а и/или задаването на IFS. Да изтървал съм долара http://sprunge.us/ZjeG Сложих и прогрес бар но нещо тук наистина не ми идва на ум как да му сложа на него в --title или --text да показва текущо конвертираната снимка. Със --text="$i" ? Титла: Re: shell скрипт zenity интерфейс Публикувано от: Rosen88 в May 04, 2015, 17:05 https://www.youtube.com/watch?v=sq9yd4mphYE
https://github.com/sandikata/ROKO__/blob/master/imagemagick-zenity Не е перфектна, доста примитивна е даже, но все пак още го изучавам... И благодарско за помощта. Титла: Re: shell скрипт zenity интерфейс Публикувано от: neter в May 04, 2015, 17:51 Не се прави така прозорец с прогрес в zenity. Така, както си го направил в момента, създава нов прозорец за прогрес за всеки файл, което води до мигане на прозорци, липса на запълващ се прогрес и загуба на смисъла да го има. Промени реда, започващ с IFS, така:
Код Целта на добавените скоби е да се докара масивът до стандартен shell масив, за да можем да броим стойностите му и така да си изчисляваме прогреса. Редактирал съм и title-а - поправена граматическа грешка и множествено число за съответствие с multiple-а. След това замени целия for цикъл с това: Код Текстът в прозорец с прогрес на zenity се сменя с echo, съдържащо символ # в началото на стринга. С това echo изписваме името на файла, който се обработва в момента. Позицията на прогреса се сменя с echo, съдържащо цифра за процента, на който прогресът трябва да се позиционира в дадения момент. Това echo трябва да съдържа само цифра и го слагаме след обработката на файла, за да отговаря на приключилата бройка файлове. Титла: Re: shell скрипт zenity интерфейс Публикувано от: Rosen88 в May 04, 2015, 18:12 Не се прави така прозорец с прогрес в zenity. Така, както си го направил в момента, създава нов прозорец за прогрес за всеки файл, което води до мигане на прозорци, липса на запълващ се прогрес и загуба на смисъла да го има. Промени реда, започващ с IFS, така: За граматическите грешки не споря с английския не съм добре :D. А за прогреса не бях сигурен как да го направя тук, въпреки че на друго място съм го правил по следния начин. Код
Ако е нещо подобно ще се опитам да го запомня твоят метод тъй като изглежда по-прост. Титла: Re: shell скрипт zenity интерфейс Публикувано от: Rosen88 в May 04, 2015, 18:18 Струва ми се че сега нищо не прави освен броенето на прогрес. Ааа всъщност е презаписала имената вместо да създаде нови файлове. Това е една от спънките..
https://github.com/sandikata/ROKO__/blob/master/imagemagick-zenity Много искам да ги понауча тези неща за да не те занимавам ама с английския като съм зле а и не мога да намеря свестен материал на български или поне руски... Титла: Re: shell скрипт zenity интерфейс Публикувано от: neter в May 04, 2015, 19:01 Ааа всъщност е презаписала имената вместо да създаде нови файлове. Това е една от спънките.. По-нагоре ти бях обърнал внимание на това. А наясно ли си, че ползвайки mogrify, вместо convert, ще имаш различен брой остатъчни файлове в зависимост от форматите на входния и изходния файл? При convert оригиналният файл остава наличен, докато резултатът се записва в друг файл. При mogrify резултатът ще се запише в друг файл, ако форматът на резултата е друг (например, входящ jpg файл, изходящ png файл), но ако форматите са еднакви (например, и входящият, и изходящият са jpg), то резултатът ще се запише върху оригинала. Няма по-добър или по-лош метод - зависи какво целиш. П.П.: От примера, който си дал, не виждам каква е разликата между "моя" метод и "твоя" метод. Парче код, принтиращо числа за стойностите на прогреса, засилено към zenity. В този пример ти нямаш множество команди, които можеш да разграничиш в стъпки, с които да пълниш прогреса, а имаш единично действие, на което искаш да определиш максимално време за изпълнение, и това си се прави точно с поредица от sleep-ове, всеки от които е стъпка от прогреса. Е, аз бих вкарал sleep-овете и dmesg-а в цикъл, за да не ги пиша няколко пъти и за да проверявам dmesg-а след всеки sleep, за да не е нужно всеки път да се чака целия timeout, ако устройството е засечено по-рано, ама пак си зависи какво целиш. А пък единично действие с неизвестно време за изпълнение, на което няма да се залага timeout и трябва да се изчака да приключи, се засилва към zenity с пулсиращ прогрес, тъй като няма нищо на стъпки, които да пълнят прогреса, а прозорецът трябва да остане отворен точно толкова време, колкото трае изпълнението на действието. Опитът за изкуствено създаване на стъпки в такива случаи води до некоректна информация за потребителя. |