GtkDialog - tips
- technosaurus
- Posts: 4853
- Joined: Mon 19 May 2008, 01:24
- Location: Blue Springs, MO
- Contact:
Variable/Function as button's label?
Hi
Is it possible to show variable or function's result as a button's label (<button></button>)?
I tried with <input>, <input file...>, <label> and nothing works...
Thanks in advance.
Greetings!
Is it possible to show variable or function's result as a button's label (<button></button>)?
I tried with <input>, <input file...>, <label> and nothing works...
Thanks in advance.
Greetings!
[color=red][size=75][O]bdurate [R]ules [D]estroy [E]nthusiastic [R]ebels => [C]reative [H]umans [A]lways [O]pen [S]ource[/size][/color]
[b][color=green]Omnia mea mecum porto.[/color][/b]
[b][color=green]Omnia mea mecum porto.[/color][/b]
Re: Variable/Function as button's label?
SFR,SFR wrote:Hi
Is it possible to show variable or function's result as a button's label (<button></button>)?
I tried with <input>, <input file...>, <label> and nothing works...
Thanks in advance.
Greetings!
Perhaps this is what you want-
Code: Select all
#! /bin/bash
LABEL=`echo result of some program`
export MAIN_DIALOG='
<button>
<label>'"$LABEL"'</label>
<action>echo new label '"$LABEL"' created</action>
</button>
'
gtkdialog3 --program=MAIN_DIALOG
Cheers,
s
Re: Variable/Function as button's label?
This is exactly it, thanks very much!seaside wrote:Perhaps this is what you want-
This would take the result of some program (in this case the phrase "result of some program") and assign it to the variable LABEL. Note that $LABEL is surrounded by double quotes followed by outer single quotes.Code: Select all
#! /bin/bash LABEL=`echo result of some program` export MAIN_DIALOG=' <button> <label>'"$LABEL"'</label> <action>echo new label '"$LABEL"' created</action> </button> ' gtkdialog3 --program=MAIN_DIALOG
I was stuck focusing myself on functions, your method is much easier.
Greetings!
[color=red][size=75][O]bdurate [R]ules [D]estroy [E]nthusiastic [R]ebels => [C]reative [H]umans [A]lways [O]pen [S]ource[/size][/color]
[b][color=green]Omnia mea mecum porto.[/color][/b]
[b][color=green]Omnia mea mecum porto.[/color][/b]
timer example
This is a simplified timer widget example. The timer widget is not visible.
Requires gtkdialog >= 0.8.0 (you may need to change the call to "gtkdialog4" in wary/racy/lupu)
Thanks to technosaurus for the text2svg function. (@ techno, the header is needed to stop gtkdialog and other gtk apps from segfaulting, coutesy of thunor).
Requires gtkdialog >= 0.8.0 (you may need to change the call to "gtkdialog4" in wary/racy/lupu)
Thanks to technosaurus for the text2svg function. (@ techno, the header is needed to stop gtkdialog and other gtk apps from segfaulting, coutesy of thunor).
Code: Select all
#!/bin/bash
# timertest
# Functions====================================================================
text2svg()
{
#generate an image
WIDTH=$(($(echo "$1"|wc -c)*19))
T=35
BG="$2"
echo '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="'$WIDTH'"
height="50"
x="0"
y="0"
style="font-size:'${T}';fill:'$BG';fill-opacity:0.75;fill-rule:evenodd;stroke-width:3pt;"
id="rect1" />
<text
x="0"
y="35"
style="font-size:'${T}';font-weight:normal;fill-opacity:0.75;stroke-width:3pt;font-family:helvetica;"
id="text1">
<tspan
id="tspan1">'"${1}"'</tspan>
</text>
</svg>' > /tmp/${3}.svg
}
export -f text2svg
randomfunc(){
echo "some random number $RANDOM"
}
export -f randomfunc
pixfunc(){
DATE=`date`
text2svg "${DATE}" "#ADD8E6" date
}
export -f pixfunc
btnfunc(){
TXT=`cat /tmp/timerfile`
case $TXT in
the)echo quick >/tmp/timerfile;text2svg quick "#0000FF" label ;;
quick)echo brown >/tmp/timerfile;text2svg brown "#00FFFF" label ;;
brown)echo fox >/tmp/timerfile;text2svg fox "#FF0000" label ;;
fox)echo jumped >/tmp/timerfile;text2svg jumped "#00FF00" label ;;
jumped)echo over >/tmp/timerfile;text2svg over "#FFFF00" label ;;
over)echo a >/tmp/timerfile;text2svg a "#FF00FF" label ;;
a)echo lazy >/tmp/timerfile;text2svg lazy "#FF9500" label ;;
lazy)echo dog >/tmp/timerfile;text2svg dog "#FF00AA" label ;;
dog)echo the >/tmp/timerfile;text2svg the "#FFFFFF" label ;;
esac
}
export -f btnfunc
#==============================================================================
echo dog >/tmp/timerfile
pixfunc
btnfunc
export gui='<window>
<vbox>
<text><label>timer test</label></text>
<pixmap>
<variable>PIX</variable>
<input file>/tmp/date.svg</input>
</pixmap>
<hbox homogeneous="true">
<button tooltip-text="exit">
<variable>BTX</variable>
<input file>/tmp/label.svg</input>
</button>
</hbox>
<text><variable>VAR</variable><input>date +%T</input></text>
<text><variable>RANDNUM</variable><input>randomfunc</input></text>
<entry><variable>ENTRY</variable><input>echo $RANDOM is random too</input></entry>
<timer interval="1" visible="false">
<action>pixfunc</action>
<action>btnfunc</action>
<action type="refresh">PIX</action>
<action type="refresh">BTX</action>
<action type="refresh">VAR</action>
<action type="refresh">RANDNUM</action>
<action type="refresh">ENTRY</action>
</timer>
<hbox>
<button ok></button>
</hbox>
</vbox>
</window>'
eval $(gtkdialog -p gui)
case $EXIT in
*)rm -f /tmp/*.svg ;;
esac
Puppy Linux Blog - contact me for access
- technosaurus
- Posts: 4853
- Joined: Mon 19 May 2008, 01:24
- Location: Blue Springs, MO
- Contact:
It often comes up how to get wget to give you the percent complete (for progress bars), so I grokked it out to work with Xdialog (I am working on some gtk1 stuff right now) - perhaps someone would like to tweak it for gtkdialog?
and here is one for curl:
{export your CURL_PARAMETERS first}
Code: Select all
download_progress(){
while ([ $# -gt 0 ]) do
wget -v $1 -o /dev/stdout | while read LINE; do
case $LINE in
*%*)LINE=${LINE##*..};echo ${LINE%%%*};;
esac
done |Xdialog --gauge "Download progress ($# files remaining.)
Current file is:
$1" 0 0
shift
done
}
{export your CURL_PARAMETERS first}
Code: Select all
upload_progress(){
curl --progress-bar $CURL_PARAMETERS 2>&1 \
| tr "\r" "\n"|sed "s,# *,,gm" \
| Xdialog --title "Progress" --gauge "$1 \n transfering ..." 0 0
}
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].
- Dougal
- Posts: 2502
- Joined: Wed 19 Oct 2005, 13:06
- Location: Hell more grotesque than any medieval woodcut
Gtkdialog enables you to run a shell inside the progressbar element, so you can just sort the wget output inside it... that's what I did with the dhcpcd progressbars (note that with gtkdialog, when you echo a number, it is used for the percentage, while echoing text changes what's displayed in the progressbar).technosaurus wrote:It often comes up how to get wget to give you the percent complete (for progress bars), so I grokked it out to work with Xdialog (I am working on some gtk1 stuff right now) - perhaps someone would like to tweak it for gtkdialog?
What's the ugliest part of your body?
Some say your nose
Some say your toes
But I think it's your mind
Some say your nose
Some say your toes
But I think it's your mind
Here's one solution to a combo-checklist. I was looking for a simple way to create a useable array for the whole checklist.
Code: Select all
#!/bin/sh
#Combo-Checklist example
export NUM="5"
function funcChkCreate() {
for ((i=1;i<"$NUM";i++)); do
echo '<checkbox>
<label>NAME '"$i"'</label>
<variable>STAT'"$i"'</variable>
</checkbox>'
done
}
ComboCheck() {
echo
for ((i=1;i<"$NUM";i++)); do
eval echo "NAME ${i}=""\$STAT${i}" >/tmp/out
var[$i]=`cat /tmp/out`
echo "${var[$i]}"
done
}
export -f ComboCheck
export MAIN_DIALOG='
<vbox height="150" scrollable="true">
'"$(funcChkCreate)"'
<hbox>
<button>
<label>ComboCheck</label>
<action>ComboCheck</action>
</button>
<button ok></button>
</hbox>
</vbox>
'
gtkdialog --program=MAIN_DIALOG
Hi.jpeps wrote:Here's one solution to a combo-checklist. I was looking for a simple way to create a useable array for the whole checklist.
I think it would be more comfortable to have the buttons outside the scrollable section.
Code: Select all
#!/bin/sh
#Combo-Checklist example
export NUM="15"
function funcChkCreate() {
for ((i=1;i<"$NUM";i++)); do
echo '<checkbox>
<label>NAME '"$i"'</label>
<variable>STAT'"$i"'</variable>
</checkbox>'
done
}
ComboCheck() {
echo
for ((i=1;i<"$NUM";i++)); do
eval echo "NAME ${i}=""\$STAT${i}" >/tmp/out
var[$i]=`cat /tmp/out`
echo "${var[$i]}"
done
}
export -f ComboCheck
export MAIN_DIALOG='
<vbox>
<vbox height="150" scrollable="true">
'"$(funcChkCreate)"'
</vbox>
<vbox>
<hbox>
<button>
<label>ComboCheck</label>
<action>ComboCheck</action>
</button>
<button ok></button>
</hbox>
</vbox>
</vbox>'
gtkdialog --program=MAIN_DIALOG
- Attachments
-
- combocheck-buttoons-outside.jpg
- (10.49 KiB) Downloaded 1197 times
[b][url=http://lazy-puppy.weebly.com]LazY Puppy[/url][/b]
[b][url=http://rshs-dna.weebly.com]RSH's DNA[/url][/b]
[url=http://murga-linux.com/puppy/viewtopic.php?t=91422][b]SARA B.[/b][/url]
[b][url=http://rshs-dna.weebly.com]RSH's DNA[/url][/b]
[url=http://murga-linux.com/puppy/viewtopic.php?t=91422][b]SARA B.[/b][/url]
I did play a little with that script, to understand how it works. Something has made me a little disturbed.
By giving 5 as NUM i always get only 4 arguments back.
I think it is because of
This one: i<"$NUM means - smaller as $NUM, but 5 is not smaller as $NUM.
So i-1<"$NUM works well and gives back 5 arguments.
In PASCAL i would write i<=$NUM, but i don't know the correct syntax in bash to use <=$NUM.
I do know:
equals = if a = b - and
unequals = if a != b
How do i write in bash a <= b ?
By giving 5 as NUM i always get only 4 arguments back.
I think it is because of
Code: Select all
for ((i=1;i<"$NUM";i++)); do
So i-1<"$NUM works well and gives back 5 arguments.
In PASCAL i would write i<=$NUM, but i don't know the correct syntax in bash to use <=$NUM.
I do know:
equals = if a = b - and
unequals = if a != b
How do i write in bash a <= b ?
[b][url=http://lazy-puppy.weebly.com]LazY Puppy[/url][/b]
[b][url=http://rshs-dna.weebly.com]RSH's DNA[/url][/b]
[url=http://murga-linux.com/puppy/viewtopic.php?t=91422][b]SARA B.[/b][/url]
[b][url=http://rshs-dna.weebly.com]RSH's DNA[/url][/b]
[url=http://murga-linux.com/puppy/viewtopic.php?t=91422][b]SARA B.[/b][/url]
How to handle a variable inside 'edit' field?
How to handle a variable inside <edit>'s <default></default> or <input></input> tags?
I wrote simple encryption tool that operates on temporary files, but it should be done on variables, for security reasons.
Anyway, as an example, let's say I have:
...and it doesn't work, 'edit' field isn't refreshed at all.
Also, tried for 256 ways to put a variable between <input></input> tags - unsuccessfully.
The odd thing is that when I press "Refresh" button, the 'message' variable is changed (first 'echo'), but on exit it returns to its previous state (second 'echo').
AFAIK variables in Bash are global by default..?
How can I do it and is it possible at all?
TIA & Greetings!
I wrote simple encryption tool that operates on temporary files, but it should be done on variables, for security reasons.
Anyway, as an example, let's say I have:
Code: Select all
#! /bin/sh
message="Something"
change () {
message="Completely different something"
echo $message # for debugging
}
export -f change
export MAIN='
<vbox>
<edit>
<variable>VAR</variable>
<default>'"$message"'</default>
</edit>
<button>
<action>change</action>
<action>refresh:VAR</action>
<label>Refresh</label>
</button>
</vbox>
'
gtkdialog -p MAIN
echo $message #for debugging also
Also, tried for 256 ways to put a variable between <input></input> tags - unsuccessfully.
The odd thing is that when I press "Refresh" button, the 'message' variable is changed (first 'echo'), but on exit it returns to its previous state (second 'echo').
AFAIK variables in Bash are global by default..?
How can I do it and is it possible at all?
TIA & Greetings!
[color=red][size=75][O]bdurate [R]ules [D]estroy [E]nthusiastic [R]ebels => [C]reative [H]umans [A]lways [O]pen [S]ource[/size][/color]
[b][color=green]Omnia mea mecum porto.[/color][/b]
[b][color=green]Omnia mea mecum porto.[/color][/b]
I'm working on an improved bacon recorder and
I used a 'refresh' of a variable successfully.
The variable SAVEFOLDER was defined earlier in the script.
I used a 'refresh' of a variable successfully.
The variable SAVEFOLDER was defined earlier in the script.
Code: Select all
<hbox>
<text><label>"Save Folder (path)"</label></text>
<entry tooltip-text=" Folder destination for recording ">
<input>cat "$WORKDIR/SAVEFOLDER"</input>
<variable>SAVEFOLDER</variable>
</entry>
<button tooltip-text=" Folder selector ">
<input file>/usr/local/share/icons/folder-open.png</input>
<action>Xdialog --title "Choose Directory to save recording" --stdout --no-buttons --no-cancel --dselect /mnt 32 80 > $WORKDIR/SAVEFOLDER</action>
<action>refresh:SAVEFOLDER</action>
</button>
<button tooltip-text="Path Examples">
<input file stock="gtk-info"></input>
<action>info_dialog</action>
</button>
</hbox>
Hi don570
You're absolutely right and a variable refresh works fine with <text><label> or <entry><input> (and even with <button><label>!),
but for unknown reason it doesn't want to cooperate with <edit><default> and <edit><input>.
I can use only <input file> to be able to refresh it.
On the other hand I'm new to GTKDialog and it may be some stupid mistake in my code,
but on the other hand again, I tried so many combinations and nothing...
I'm totally confused by this...
Thanks anyway
EDIT:
My first example was a bit fuzzy, here's another one where refreshing doesn't work:
Greetings!
You're absolutely right and a variable refresh works fine with <text><label> or <entry><input> (and even with <button><label>!),
but for unknown reason it doesn't want to cooperate with <edit><default> and <edit><input>.
I can use only <input file> to be able to refresh it.
On the other hand I'm new to GTKDialog and it may be some stupid mistake in my code,
but on the other hand again, I tried so many combinations and nothing...
I'm totally confused by this...
Thanks anyway
EDIT:
My first example was a bit fuzzy, here's another one where refreshing doesn't work:
Code: Select all
#!/bin/sh
export MAIN='
<vbox>
<edit>
<variable>VAR</variable>
<default>'"`date`"'</default>
</edit>
<button>
<action>refresh:VAR</action>
<label>Refresh</label>
</button>
</vbox>
'
gtkdialog -p MAIN
[color=red][size=75][O]bdurate [R]ules [D]estroy [E]nthusiastic [R]ebels => [C]reative [H]umans [A]lways [O]pen [S]ource[/size][/color]
[b][color=green]Omnia mea mecum porto.[/color][/b]
[b][color=green]Omnia mea mecum porto.[/color][/b]
SFR,
This works -
Generally, only "<variable>VAR</variable>" variables get set on a "refresh:VAR" command. Variables like "$message" are set once and if a "child process" (such as a function) is begun in an attempt to reset a variable, it isn't visible to the parent (original gtkdialog program).
You'll notice that frequently /tmp files are used to hold variables so that they can be referenced in those cases.
Cheers,
s
This works -
Code: Select all
export MAIN='
<vbox>
<entry>
<variable>VAR</variable>
<input>date</input>
</entry>
<button>
<action>refresh:VAR</action>
<label>Refresh</label>
</button>
</vbox>
'
gtkdialog3 -p MAIN
You'll notice that frequently /tmp files are used to hold variables so that they can be referenced in those cases.
Cheers,
s
Yes, this works, but after deeper reflection I think that GTKDialog simply doesn't provide this mechanism in <edit> widget.seaside wrote:This works -
Code: Select all
export MAIN=' <vbox> <entry> <variable>VAR</variable> <input>date</input> </entry> <button> <action>refresh:VAR</action> <label>Refresh</label> </button> </vbox> ' gtkdialog3 -p MAIN
entry widget definition:
There are <input file> AND <input> directives available. All right.Code: Select all
<entry tag_attr="value"...> <default>text</default> <variable>varname</variable> <height>value</height> <width>value</width> <input>command</input> <input file>filename</input> <sensitive>state</sensitive> <action>activity</action>... <action signal="type">activity</action>... <action type="function">parameter</action>... <output file>filename</output> </entry>
edit widget definition:
There's ONLY <input file> directive...Code: Select all
<edit tag_attr="value"...> <default>state</default> <variable>varname</variable> <height>value</height> <width>value</width> <input file>filename</input> <sensitive>state</sensitive> <action signal="type">activity</action>... <output file>filename</output> </edit>
But nevermind - I can use 'shred' to delete temp files in a secure way.
Thanks for clarification, I suspected something like that, but wasn't sure how exactly it works.seaside wrote:Generally, only "<variable>VAR</variable>" variables get set on a "refresh:VAR" command. Variables like "$message" are set once and if a "child process" (such as a function) is begun in an attempt to reset a variable, it isn't visible to the parent (original gtkdialog program).
You'll notice that frequently /tmp files are used to hold variables so that they can be referenced in those cases.
Thanks again to all of you & Greetings
[color=red][size=75][O]bdurate [R]ules [D]estroy [E]nthusiastic [R]ebels => [C]reative [H]umans [A]lways [O]pen [S]ource[/size][/color]
[b][color=green]Omnia mea mecum porto.[/color][/b]
[b][color=green]Omnia mea mecum porto.[/color][/b]
I will explain the new event-handling in Pmusic 2.4.0. It is a smarter way to update gui on non-user-actions. User-actions is mouse-clicks and key-entries, and is the common way to interact between user and gui. An example of updating the gui on a non-user-action in Pmusic is the loading of id3-tags for files shown in the file-browser....
When clicking on a directory, the browser field refreshes and shows the content of the new directory. Now, Pmusic continues with a background process to read the id3 information of the files. When finished, the browser field should be updated by the new info. - Without the user to click anywhere.
The solution is to either use a <progressbar> which runs its <action> when reaches 100% or a <timer> which acts at a given interval. Older Pmusic releases used the <progressbar> solution while recent code uses a <timer>. Both solutions has the downside that they uses an amount of cpu power. In a complex gui with several non-user actions this could end up with several cpu-hungry <timers> updating their unique widget(s) of the gui.
Pmusic has used 2 <timers> running constantly to update their defined gui-part. You might think that 1 <timer> would be enough, - it could refresh all wanted widgets - it wouldn't harm if the refreshing didn't change anything. BUT, refreshing has an effect on the focus handling. It simply resets the focus, which means that:
- scrolling in <table> is moved to top.
- what you are about to write in an <entry> is cleared.
- Your selected item in the <tree> is not selected anymore
- ...
The idea of Pmusic 2.4.0 was to update all kinds of trackinfo (meta-tags, lyrics, albumart, discography, ...) when a new track starts playing. This would not be possible with the underlaying event-handling in Pmusic because it would either suck you cpu-power (with several <timers>), or a global refreshing would make it impossible to be a user (because of focus issues). Also, there is a fact that too many refreshing <action> on a <timer> will increase cpu-usage as well.
So the solution has been to add ONE <timer>, which refreshes a small set of <checkboxes> that (if true) refreshes a single or group of widgets.
<checkboxes> can be set true or false by their <input file>, so we can simply 'echo true' to its <input file>. The <timer> runs its <actions> each second, and the <checkbox> will be refreshed by its <input file>. The code could look like this:
All actions will run only if value is true. To avoid more than one refreshing we reset <input file> and the <checkbox> value to false. Now it will be silent until next time we 'echo true > inputfile'.
When clicking on a directory, the browser field refreshes and shows the content of the new directory. Now, Pmusic continues with a background process to read the id3 information of the files. When finished, the browser field should be updated by the new info. - Without the user to click anywhere.
The solution is to either use a <progressbar> which runs its <action> when reaches 100% or a <timer> which acts at a given interval. Older Pmusic releases used the <progressbar> solution while recent code uses a <timer>. Both solutions has the downside that they uses an amount of cpu power. In a complex gui with several non-user actions this could end up with several cpu-hungry <timers> updating their unique widget(s) of the gui.
Pmusic has used 2 <timers> running constantly to update their defined gui-part. You might think that 1 <timer> would be enough, - it could refresh all wanted widgets - it wouldn't harm if the refreshing didn't change anything. BUT, refreshing has an effect on the focus handling. It simply resets the focus, which means that:
- scrolling in <table> is moved to top.
- what you are about to write in an <entry> is cleared.
- Your selected item in the <tree> is not selected anymore
- ...
The idea of Pmusic 2.4.0 was to update all kinds of trackinfo (meta-tags, lyrics, albumart, discography, ...) when a new track starts playing. This would not be possible with the underlaying event-handling in Pmusic because it would either suck you cpu-power (with several <timers>), or a global refreshing would make it impossible to be a user (because of focus issues). Also, there is a fact that too many refreshing <action> on a <timer> will increase cpu-usage as well.
So the solution has been to add ONE <timer>, which refreshes a small set of <checkboxes> that (if true) refreshes a single or group of widgets.
<checkboxes> can be set true or false by their <input file>, so we can simply 'echo true' to its <input file>. The <timer> runs its <actions> each second, and the <checkbox> will be refreshed by its <input file>. The code could look like this:
Code: Select all
<checkbox visible="false">
<label>a</label>
<variable>UPDATE_GUI</variable>
<input>cat /path/UPDATE_GUI</input>
<action>if true refresh:PLAYLIST</action>
<action>if true refresh:ARTWORK</action>
<action>if true refresh:BUTTON_PLAY</action>
<action>if true echo false > /path/UPDATE_GUI</action>
<action>if true refresh:UPDATE_GUI</action>
</checkbox>