SliTaz SliTaz Forum

You are not logged in.

#1 2012-10-20 21:39:56

sklimkin
Member
Registered: 2012-10-08
Posts: 99

gtkdialog - not for scripting only

Читая ньюсы slitaz обнаружил намерение разработчиков в 5-й версии отказаться от gtkdialog в пользу "жабы".

Сам по себе gtkdialog очень маленький и почти без зависмостей, что важно/ценно.

И еще он хорошо юзает возможности zenity (который есть в slitaz по умолчанию).

Хочу проинформировать, что gtkdialog можно юзать не только в связке с sh/bash, но и в СИ (без плюсов)

http://linuxforum.ru/viewtopic.php?pid=287604#p287604

маленький пример на чистом СИ

http://www.murga-linux.com/puppy/viewtopic.php?p=639831#639831

Это если нужна скорость работы программы и нет времени изучать нюансы GTK-программирования.

Offline

#2 2012-10-20 23:20:16

lexeii
Administrator
Registered: 2012-03-21
Posts: 1,853

Re: gtkdialog - not for scripting only

Я извиняюсь, «жаба» — это… что?

Offline

#3 2012-10-21 09:19:25

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: gtkdialog - not for scripting only

> Я извиняюсь, «жаба» — это… что?

Java

Не могу снова найти эту инфу.

Offline

#4 2012-10-21 12:05:15

lexeii
Administrator
Registered: 2012-03-21
Posts: 1,853

Re: gtkdialog - not for scripting only

Тут или что-то было понято неправильно, или суровые разработчики замели следы big_smile

Я не видел ничего жирнее и неповоротливей, чем Java. Не место ей на микро-системе.

Offline

#5 2012-10-30 14:49:06

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: gtkdialog - not for scripting only

Для тех, кто пока только присматривается к программированию, но не знает с чего начать,

повторю в более развернутом виде свой первый пост.

gtkdialog - простой инструмент создания окон на bash-script

-----------------------------------------------------------

Все пользователи всех Линуксов постоянно используют для работы своей ОС кучу самых разнообразных скриптов, зачастую и не подозревая об их существовании.

Но некоторые скрипты (некоторые их функции) разаботчики связывают с графическими окнами, которые позволяют задавать пользователю вопросы, получать ответы и на их основании выполнять некоторые действия.

Диалоговые (и не только) окна в Линукс - простое средство создания.

-------------------------------------------------------------------

Есть в Линуксе библиотека zenity, позволяющая "визуализировать" простейшие скриптовые диалоги.

Например:

#!/bin/bash

if zenity --question --text="Please press a button."; then

    zenity --info --text="You pressed Yes\!"

else

    zenity --error --text="You pressed No\!"

fi

Выведет окно "Question" с кнопками "No" "Yes"

Но zenity может не так много.

gtkdialog опирается на zenity и добавляет к ней многие функции/возможности GTK+

(GTK, GTK2, GTK+ это абревиатуры инструментов/библиотек графического программирования в Линукс).

При этом не требуется добавлять в систему монстров графического программирования.

В любом "блокноте" пишется bash-script или СИ-функция/функции. И все!

gtkdialog имеет много хороших примеров bash-script.

Автор Laszlo Pere предоставил возможность делать программы и на языке СИ, но пример такой программы всего один (и очень маленький).

Возможности программы gtkdialog в этом случае значительно беднее, чем у bash-script.

Некоторые пользователи могут писать на bash-script хуже, чем на СИ (как я например).

Учитывая это я сделал пример на языке СИ.

Конструкции gtkdialog для СИ не позволяют например такие вещи:

<window window_position="1" title="System Tools">

или:

<action when="file-activated">echo File: $FILE </action>

Это удалось обойти таким способом:

"<action>cat [ echo $FILE ] | zenity --text-info  --width=720 --height=400 --title $FILE</action>"

Но даже с такими ограничениями мне было интересно сделать программу, которая не требует тяжелых библиотек (так я во всяком случае думаю).

Свой пример на СИ и скриншот положил на мурге:

http://www.murga-linux.com/puppy/viewtopic.php?p=639831#639831

(после этого тема там немного оживилась)

Это тема " Gtkdialog Development"

http://www.murga-linux.com/puppy/viewtopic.php?t=69188

Все примеры на bash-script лежат:

http://code.google.com/p/gtkdialog/

там же можно скачать и пакет обновленный энтузиастами в сентябре 2011 года

gtkdialog-0.8.0.tar.gz   404 KB

GtkDialog - tips (подсказки)

http://www.murga-linux.com/puppy/viewtopic.php?t=38608

Авторский пакет 0.56--0.7.10 (сентябрь 2003 - ноябрь 2006) находится:

http://www.mmnt.net/db/0/0/gamma.ttk.pte.hu/pub/gtkdialog

я пользовался gtkdialog-0.59.8.tar.gz   234 KB (июль 2005 года)

но версия 0.8.0 гораздо богаче...

И до кучи примеры с иллюстрациями:

Creating a GUI with GTKDialog

http://pclosmag.com/html/Issues/200910/page21.html

http://xpt.sourceforge.net/techdocs/language/gtkdialog/gtkde02-GtkdialogExamples/single/

почти учебник:

http://hizoka.funcenter.fr/linux/gtkdialog.pdf

Диалоги на самые разные вкусы:

http://freecode.com/projects/xdialog

http://invisible-island.net/dialog/

http://hightek.org/dialog/

http://xdialog.free.fr/

http://code.google.com/p/yad/

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

Чтение этих книжек потребуется на более поздних этапах практического использования этого инструмента.

Offline

#6 2012-11-18 22:44:23

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: gtkdialog - not for scripting only

Тема "screenshot снимок экрана" уже распухла, поэтому выкладываю новые изыскания по gtkdialog здесь.

Это просто этюд по созданию чего-то более сложного, чем одно окно. Смотрите "About" и текст скрипта.

#!/bin/sh

funccommand () {

if [ "$COMBOBOX1" == "All" ]; then

COMMAND1="-m"

else COMMAND1="-s"

fi

## !!! Attention: This works in scrot ver. >= 0.8 only !!!

if [ "$COMBOBOX1" == "Window" ]; then

COMMAND1="-u"

fi

COMMAND2="$COMBOBOX2"

COMMANDSTRING="$COMMAND1-b-d $COMMAND2"

_dir=[c]dirname "$FILE"[/c]

cd "${_dir}"

echo FILE= "${_dir}"

scrot "$COMMANDSTRING"

}

export ABOUT='

<window title="About Message">

<frame About scripting & gtkdialog. Text-widget example:>

        <text>

        <width>360</width>

        <height>250</height>

            <variable>PROGRAM</variable>

            <label>This program is only demonstration of some possibilities of sharing of the program gtkdialog and bash-script. Here are specially used menubar and a main window with widgets. !!!Attention. It is only demo!!!</label>

        </text>

</frame>

</window>

'

export HELP='

<window title="Help Message">

<frame Help from gtkdialog. Edit-widget example:>

    <edit>

      <input file>tmp.text</input>

      <width>400</width><height>350</height>

      <default>"default text of the editor"</default>

      <variable>EDIT</variable>

    </edit>

</frame>

</window>

'

export MAIN_DIALOG="

<window>

<frame MenuBar & gtk-widgets in MAIN_DIALOG>

   <vbox>

   <vbox>

      <menubar>

         <menu>

            <menuitem><label>About</label>

            <action>Launch:ABOUT</action>

            </menuitem>

             <menuitem><label>EXIT</label>

               <action>exit:Quit</action>

            </menuitem>

            <label>About</label>

         </menu>

         <menu>

            <menuitem><label>AbiWord</label>

                <action>abiword</action>

            </menuitem>

            <menuitem><label>Gnumeric</label>

                <height>32</height>

                <action>gnumeric</action>

            </menuitem>

            <menuitem><label>PCmanFM</label>

                <action>pcmanfm</action>

            </menuitem>

            <label>Run-Programs</label>

         </menu>

         <menu>

            <menuitem><label>current date</label>

                <action>date>tmp.text</action>

                <action>Launch:HELP</action>

            </menuitem>

            <menuitem><label>tazpkg help</label>

                <action>tazpkg --help>tmp.text</action>

                <action>Launch:HELP</action>

            </menuitem>

            <menuitem><label>help export</label>

                    <action>man export>tmp.text</action>

                <action>Launch:HELP</action>

            </menuitem>

            <menuitem><label>help cd</label>

                <action>man cd>tmp.text</action>

                <action>Launch:HELP</action>

            </menuitem>

            <menuitem><label>busybox</label>

                <action>busybox>tmp.text</action>

                <action>Launch:HELP</action>

            </menuitem>

            <label>Help</label>

         </menu>

      </menubar>

    <hbox>

        <combobox>

          <width>60</width>

          <variable>COMBOBOX1</variable>

          <item>All</item>

          <item>Window</item>

          <item>Area</item>

          <action>save:COMBOBOX1</action>

        </combobox>

        <combobox>

          <width>20</width>

          <variable>COMBOBOX2</variable>

          <item>0</item>

          <item>1</item>

          <item>2</item>

          <item>3</item>

          <item>5</item>

          <item>10</item>

          <item>20</item>

          <action>save:COMBOBOX2</action>

        </combobox>

        <button>

            <label>ACCEPT</label>

            <action>$0 func</action>

        </button>

        <button cancel>

            <action>rm tmp.text</action>

            <action>exit:Quit</action>

        </button>

    </hbox>

<frame DubleClick ANY file in selected dir>

    <chooser>

        <width>200</width>

        <height>200</height>

        <variable>FILE</variable>

        <default>/home/</default>

        <action>$2= $FILE</action>

    </chooser>

</frame>

   </vbox>

   </vbox>

</frame>

</window>

"

case $1 in

    func) funccommand $2 ;;

   *) gtkdialog --program=MAIN_DIALOG ;;

esac

Для того, чтобы скрипт (а точнее gtkdialog) мог вызвать функцию funccommand () пришлось делать:

export MAIN_DIALOG="

<window>

... ... ...

</window>

"

такая форма записи (через " ... ") менее удобна и ограничена в функциональности

в отличии от более удобной записи (через ' ... ') для других окон:

export ABOUT='

<window title="About Message">

... ... ...

</window>

'

export HELP='

<window title="Help Message">

... ... ...

</window>

'

Offline

#7 2012-11-30 11:34:28

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: gtkdialog - not for scripting only

ScreenShot + gtkdialog с некоторыми модификациями/исправлениями.

2 варианта: бинарный gcc + GTK2 и скриптовый.

mediafire-download:

http://www.mediafire.com/?l79j1cb2ll4gbhc

http://www.mediafire.com/?mzill1xlng47g31

Offline

#8 2012-12-02 21:47:17

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: gtkdialog - not for scripting only

gtkdialog понравился настолько, что разобрался с меню (menu-bar) и иконками (для красоты).

Прикладываю скриншот.

Если кому будет интересно - выложу код скрипта.

[attachment=19162,806]

Offline

#9 2012-12-06 18:24:27

kitty____
Member
Registered: 2012-12-06
Posts: 36

Re: gtkdialog - not for scripting only

ой, выложи, пожалуйста, интересно))))

Offline

#10 2012-12-14 11:02:05

sklimkin
Member
Registered: 2012-10-08
Posts: 99

Re: gtkdialog - not for scripting only

[c]#!/bin/sh
## icon-name="gcolor2"icon-name="exec"
GTKDIALOG=gtkdialog

funccommand () {
if [ "$COMBOBOX1" == "All" ]; then
  COMMAND1="-m"
  else COMMAND1="-s"
fi
## !!! Attention: This works in scrot ver. >= 0.8 only !!!
if [ "$COMBOBOX1" == "Window" ]; then
  COMMAND1="-u"
fi
COMMAND2="$COMBOBOX2"
COMMANDSTRING="$COMMAND1-b-d $COMMAND2"
_dir=$(dirname "$FILE")
cd "${_dir}"
scrot "$COMMANDSTRING"
}

export ABOUT='
    <text>
        <variable>PROGRAM</variable>
        <label>This program is only demonstration of some possibilities of sharing of the program gtkdialog and bash-script. Here are specially used menubar and a main window with widgets. Also as well as various methods of a call of functions. See FileChooser in menubar & DIR-icon in main-window. !!!Attention: It is only demo!!!</label>
    </text>
        <action>echo PROGRAM= $PROGRAM</action>
'

export HELP='
<frame Help from gtkdialog. Edit-widget example:>
    <edit>
      <input file>tmp.text</input>
      <width>400</width><height>350</height>
      <default>"default text of the editor"</default>
      <variable>EDIT</variable>
    </edit>
</frame>
'

export CHOOSER='
    <frame DubleClick any file in Selected DIR for save screenshot & close dialog>
        <chooser>
            <width>360</width>
            <height>250</height>
            <variable>FILE</variable>
            <default>/home/</default>
            <action>save:FILE</action>
            <action>echo FILE= $FILE</action>

        </chooser>
    </frame>
'

export MAIN_DIALOG='
<window title="GtkDialog & MenuBar" icon-name="exec" resizable="false" width-request="340" height-request="190">
    <vbox>
    <vbox spacing="10">
        <menubar>
             <menu>
                <menuitem stock="gtk-open">
                    <action>echo You selected the open menu item</action>
                </menuitem>
                <menuitem stock="gtk-save">
                    <action>echo You selected the save menu item</action>
                </menuitem>
                <separator></separator>
                <menuitem stock="gtk-quit">
                    <action>exit:Quit</action>
                </menuitem>
            <label>File</label>
            </menu>
            <menu>
                <menuitem icon="abiword">
                <label>AbiWord</label>
                    <action>abiword &</action>
                </menuitem>
                <menuitem icon="gnumeric">
                <label>Gnumeric</label>
                    <action>gnumeric &</action>
                </menuitem>
                <menuitem icon="gimp">
                <label>Gimp</label>
                    <action>gimp &</action>
                </menuitem>
                <separator></separator>
                <menuitem icon="fileopen">
                <label>FileChooser</label>
                    <action>Launch:CHOOSER</action>
                </menuitem>
            <label>Run-Programs</label>
            </menu>
            <menu>
                <menuitem icon="time">
                <label>current date</label>
                    <action>date>tmp.text</action>
                    <action>Launch:HELP</action>
                </menuitem>
                <separator></separator>
                <menuitem icon="abiword">
                <label>abiword help</label>
                    <action>abiword --help>tmp.text</action>
                    <action>Launch:HELP</action>
                </menuitem>
                <menuitem icon="help">
                <label>help mount</label>
                    <action>man mount>tmp.text</action>
                    <action>Launch:HELP</action>
                </menuitem>
                <menuitem icon="help">
                <label>help sh</label>
                    <action>man sh>tmp.text</action>
                    <action>Launch:HELP</action>
                </menuitem>
                <separator></separator>
                <menuitem label="busybox">
                    <action>busybox>tmp.text</action>
                    <action>Launch:HELP</action>
                </menuitem>
            <label>Help</label>
            </menu>
             <menu>
                <menuitem stock="gtk-about">
                    <action>Launch:ABOUT</action>
                </menuitem>
                <separator></separator>
                <menuitem icon="gtk-about">
                <label>gtkdialog about</label>
                    <action>gtkdialog --help>tmp.text</action>
                    <action>Launch:HELP</action>
                </menuitem>
                <menuitem icon="info">
                <label>gtkdialog version</label>
                    <action>gtkdialog -v>tmp.text</action>
                    <action>Launch:HELP</action>
                </menuitem>
            <label>About</label>
            </menu>
        </menubar>

        <hbox>
            <entry>
                <input>date</input>
                <variable>FILE</variable>
            </entry>
            <button>
                <input file stock="gtk-open"></input>
                <action>Fileselect:FILE</action>
                <action>echo FILE= $FILE</action>

<action>Refresh:StatusBar</action>
            </button>
        </hbox>

        <frame Screen-Shoter>
        <hbox>
            <button cancel>
                <action>rm tmp.text</action>
                <action>exit:Quit</action>
            </button>
            <combobox width-request="90">
                <variable>COMBOBOX1</variable>
                <item>All</item>
                <item>Window</item>
                <item>Area</item>
                <action>save:COMBOBOX1</action>
            </combobox>
            <combobox width-request="60">
                <variable>COMBOBOX2</variable>
                <item>0</item>
                <item>1</item>
                <item>2</item>
                <item>3</item>
                <item>5</item>
                <item>10</item>
                <item>20</item>
                <action>save:COMBOBOX2</action>
            </combobox>
            <button>
                <label>ACCEPT</label>
                <action>'"$0 func"'</action>
            </button>
        </hbox>
        </frame>

        <vseparator height-request="2"></vseparator>

        <statusbar has-resize-grip="false">
            <variable>StatusBar</variable>
            <label>StatusBar</label>
<input file>inputfile</input>
            <sensitive>true</sensitive>
        </statusbar>

    </vbox>
    </vbox>
</window>
'

case $1 in
    func) funccommand $2 ;;
   -d | --dump) echo "$MAIN_DIALOG" ;;
   *) $GTKDIALOG --program=MAIN_DIALOG ;;
esac[/c]
--------------------------------------------------------------------------------

Примечания:

1. <label>This program is only ... ... ... It is only demo!!!</label> должно быть ОДНОЙ строкой.

2. эти 2 строки все, что смог получить от элемента StatusBar

<action>Refresh:StatusBar</action>

<input file>inputfile</input>

первая обновляет содержимое строки в StatusBar

вторая читает то, что надо поместить в StatusBar из файла inputfile

файл inputfile должен быть в том же DIR, что и сам скрипт.

3. в ОС slitaz и других маленьких линукс-системах (например puppy-linux) иконки "находятся",

а в linux-ubuntu иконки не "находятся", разбираться с этим не стал.

Мне достаточно меню только с текстами (иконки только из любопытства).

4. тема gtkdialog наиболее активна на конференции

http://murga-linux.com/puppy/viewtopic.php?t=69188

http://murga-linux.com/puppy/viewtopic.php?t=38608

там есть даже ветка связки gtkdialog--bacon (бейсик).

Offline

#11 2012-12-14 12:48:32

lexeii
Administrator
Registered: 2012-03-21
Posts: 1,853

Re: gtkdialog - not for scripting only

Кхм, я извиняюсь. Я чуть подправил предыдущий пост — поставил в начале и в конце листинга по символу [c]`[/c] и внутри изменил в одной строке применяемые там обратные кавычки на конструкцию $(код).

Я уверен, что листинг, оформленный «лесенкой», читается легче. Но, вот только с длинными строками ничего не поделаешь. В одинарных кавычках символ \ в конце строки не работает. So, let it be…

2 sklimkin

Здорово ведь осваивать новые вещи! Здорово, когда получается! Искренне поздравляю.

К сожалению, код у меня не то, что бы не заработал, но, мой gtkdialog никак не переваривает vseparator и statusbar.

Но даже и без них диалог смотрится просто здорово! Как обычная программа, и не скажешь, что это скрипт.

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.019 seconds, 7 queries executed - Memory usage: 1.61 MiB (Peak: 1.77 MiB) ]