[Scilab-users] ?==?utf-8?q? GUI help

Claus Futtrup cfuttrup at gmail.com
Thu Nov 28 17:05:24 CET 2019


Hi Antoine, et al.

Your reply is very helpful, so I think you got the right question :-)

1) Good point that I can use callback on every uicontrol. This would be 
suitable for a simple example (like gui_example.sce) ... but for heavy 
calculations, it might be more practical with a CALC button. P.S. The 
correct equation for the resonance frequency is fres=sqrt(k/m)/(2*%pi);

2) I see what you mean, so not having an empty space, but "show" the 
whole she-bang from the beginning. I didn't want to do that (just 
deleting the IF-statement), but it could be the best solution in the end 
(rather than the inline GUI updates), if nothing better shows up. This 
was somehow the "core" of my question. Maybe I ask for too much.

3) I will look into this. Thanks for the tip.

4) I will also look into this. My problem is the steep learning curve. 
If you look at the Scilab tutorials you have the good-old Openeering 
LHY_Tutorial - it's incredibly complicated and long. Is LHY_Tutorial 
using the Model-Viewer-Controller approach? - Maybe the 
Model-Viewer-Controller could be presented in a _simple_ tutorial - is 
it possible?

I appreciate gui_example.sce with just about 70 lines of code, two 
inputs and one output. I think something like it could help a lot of 
people ... and it's not 250 lines of code to get a GUI up and running, 
if you know what I mean. The gui_example shows a few differences, like 
white versus grey background, editable boxes, etc. In the outputs, 
because of the default grey background, you can see the dimensions of 
the grid / text-boxes, and gui_example has two buttons. It looks 
operational and easy to expand for new users.

Cheers,
Claus

On 28.11.2019 08:57, Antoine Monmayrant wrote:
> Hello Claus,
>
> I've been playing a bit with GUIs for teaching, so maybe I can help.
> The issue is that I don't get what your problem is exactly here, so I my answer might be a bit off-topic.
> Do not hesitate to rephrase your issue, I'll try a more focused answer.
>
> Anywya, here is how I think your code could be improved:
>
> (1) You can use 'calc' as the callback for all of the editable text field so that your result gets shown right away, without having to press a button.
> (2) You should populate all the uicontrols of your gui first, then only update the displayed values, the visibility of the uicontrols, etc inside your calc function. (ie no more creating a uicontrol inside a callback)
> (3) The 'tag' property of any uicontrol together with 'findobj()' are really nice to get/set the properties of each existing uicontrol.
> (4) You can rely on a proper Model-View-Controler approach (or any other well established method to avoid mixing gui stuff with calculation stuff).
>
> I attached a small gui I use to illustrate optical anti-reflection coating.
> It is far from perfect (I did not implement a proper model-view-controler for example).
> But you can see how I tried to separate the different parts of the code an how I use findobj/tag/get/set,  etc.
>
> Hope it helps,
>
> Antoine
>   
> Le Mercredi, Novembre 27, 2019 19:21 CET, Claus Futtrup <cfuttrup at gmail.com> a écrit:
>   
>> Hi there
>>
>> I'm trying to build a GUI. For simplicity on the forum, I've built a
>> really simple example of what I'm trying to do. How can I make the
>> "conditional" GUI output work and not have it inside the calc function?
>> ... or, how would you do it? Thanks.
>>
>> Best regards, Claus.
>>
>> // GUI_EXAMPLE.SCE
>> //
>> // Demo of how to build a simple GUI in Scilab.
>> // Real simple, with two input variables and one output.
>> // The example uses the basic mechanical example of a mass and a spring as
>> // input parameters and calculates the resonance frequency of the mechanical
>> // system.
>>
>> // Initialize variables
>> m  =  1;  // Moving mass 'm'(kilogram)
>> k  =  1;  // Stiffness, spring constant 'k'(Newton per meter)
>> fres  =  1;  // Resonance frequency (Hertz)
>> show_result  =  %f;
>>
>> function  calc()
>>       m  =  evstr(get(ge_m,"string"));  // get content in uicontrol ge_m
>>       k  =  evstr(get(ge_k,"string"));  // get content in uicontrol ge_k
>>       fres  =  sqrt(m  *  k);
>>       // putting GUI updates inside the calculation routine is not pretty code.
>>       uicontrol("style","text","string","Result :","position",  ..
>>                 [10  as(2)-110  80  20]);
>>       uicontrol("style","text","string",string(fres),  ..
>>                 "position",[100  as(2)-110  80  20]);
>>       uicontrol("style","text","string","Hz ","position",  ..
>>                 [200  as(2)-110  30  20]);
>>       show_result  =  %t;
>>       // update global variables
>>       [m,k,fres,show_result]=return(m,k,fres,show_result);
>> endfunction
>>
>> function  goodbye()
>>       close(ge);  // Close GUI window
>>       printf("Resulting fres: %f Hertz\n",fres);
>>       abort  // Print result in console (e.g. for copy/paste), then kill the app
>> endfunction
>>
>> ge  =  scf();  // GUI Example, Initialize and 'set current figure'
>> as  =  ge.axes_size;  // read size of window, as = [width height]
>> ge.figure_name  =  "GUI Example";  // Change window header
>>
>> uicontrol("style","text","string","Moving mass :","position",  ..
>>             [10  as(2)-35  80  20],"background",[1  1  1]);  // white background
>>             // position properties has four parameters = x,y,width,height
>>             // y-position counts from lower left corner, so we subtract from 'as'
>> ge_m  =  uicontrol("style","edit","string",string(m),  ..
>>             "position",[100  as(2)-35  80  20]);
>> uicontrol("style","text","string","kg ","position",  ..
>>             [200  as(2)-35  30  20],"background",[1  1  1]);
>>
>> uicontrol("style","text","string","Stiffness :","position",  ..
>>             [10  as(2)-60  80  20],"background",[1  1  1]);
>> ge_k  =  uicontrol("style","edit","string",string(k),  ..
>>             "position",[100  as(2)-60  80  20]);
>> uicontrol("style","text","string","N/m ","position",  ..
>>             [200  as(2)-60  30  20],"background",[1  1  1]);
>>
>> uicontrol("style","pushbutton","string","Calculate",  ..
>>             "position",[10  as(2)-85  80  20],"callback","calc");
>>
>> // How do I make this "conditional"output show up in my GUI?
>> if  show_result  then  // If "Calculate"button was pushed at least once ...
>>       uicontrol("style","text","string","Result :","position",  ..
>>                 [10  as(2)-110  80  20]);
>>       uicontrol("style","text","string",string(fres),  ..
>>                 "position",[100  as(2)-110  80  20]);
>>       uicontrol("style","text","string","Hz ","position",  ..
>>                 [200  as(2)-110  30  20]);
>> end
>>
>> uicontrol("style","pushbutton","string","Exit",  ..
>>             "position",[10  as(2)-135  80  20],"callback","goodbye");
>>
>>
>> _______________________________________________
>> users mailing list
>> users at lists.scilab.org
>> http://lists.scilab.org/mailman/listinfo/users


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20191128/70201ce7/attachment.htm>


More information about the users mailing list