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

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


Hi Philipp, et al.

Thanks for the (long) email. I appreciate it.

Way 1 - I already do.
Way 2 - Yes, the established part of the GUI updates, no problem. The 
big question was if I could turn certain parts of the GUI on (and maybe 
off again)?
Way 3 - interesting idea, to use a "handles" container for all 
variables. I'll think about it. Is this "only" an easy way to pass 
around lots of variables, or is there something more internal with the 
GUI that is smart with this solution?

Best regards,
Claus

On 28.11.2019 10:53, P M wrote:
> Hallo Claus,
>
> from what I understand the question is: How can GUI updated outside of 
> the function "calc" ?
>
> In other words:
> right now "calc" updates the GUI.
> I guess the aim is that "calc" only returns output values, which will 
> be used to update the GUI .
>
> Way 1:
> Use global variables, which can be used in every function of the GUI.
> The return value of the function will change this global variable.
>
> Way 2
> Give the calc() function output variables, such as:
> function [out_var1, out_var2] = calc(arg1, arg2)
>     out_var1 = arg1 + ...
>     out_var2 = arg2 +....
> endfunction
> With this it should be possible to update the GUI outside of a 
> callback function.
>
> Way 3.....similar to way 1...and the way I did in the past
> use a single global variable, called: handles
>
> handles is more a structure, than a single variable.
> It contains all uicontrols aswell as all variables necessary to update 
> the GUI.
> e.g.:
>
> handles.f1 = figure(....)      // that would be the main GUI
> handles.f2 = figure(....)      // that would be a sub GUI
> handles.pb1 = uicontrol()   // that would be a push button of the GUI
> handles.var1 = ....             // that would be a variable, necessary 
> to keep available to all uicontrols
> handles.var2 = ....             // that would be another variable, 
> necessary to keep available to all uicontrols
>
>
> When definig the callback function it would look like this:
>
> function calc(handles)
>   locVar1 = handles.var1
>   locVar2 = handles.var2
>   //...do the calculations...to change locVar1, locVar2
>   //...update the handle variable(s)
>   handles.var1 = locVar1
>   handles.var2 = locVar2
>   handles = resume(handles)
> endfunction
>
> one would call the function just as:     calc(handles)
>
>
> A general note:
> It helps to put all callback functions into a separate subfolder
> The main function (that only defines the GUI) will call and load all 
> callback functions from that subfolder.
>
> I give callback function scripts the extension:  *.sci
> I give the main GUI script the extension: *.sce
> This is all not mandatory, but increases the overview.
>
> To create the global variable "handles" I define a separate function:
>
> function handles = Init(handles)
>   handles.var1 = 0  // init value of var1
>   handles.var2 = 0  // init value of var2
>   handles.cmap = graycolormap(255)  // init GUI colormap
>   handles.statusSlider = 0    // can be a status variable for a 
> slider..if it has been used or not
>   handles.statusPB = 0       // can be a status variable for a push 
> bitton ..such as: has been pressed or not
>   // etc...
>
>   handles = resume(handles)
> endfunction
>
> sorry for the long Mail,
> Best regards,
> Philipp
>
>
>
>
>
>
>
>
>
> Am Do., 28. Nov. 2019 um 08:57 Uhr schrieb Antoine Monmayrant 
> <amonmayr at laas.fr <mailto:amonmayr at laas.fr>>:
>
>     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 <mailto: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 <mailto:users at lists.scilab.org>
>     http://lists.scilab.org/mailman/listinfo/users
>
>
> _______________________________________________
> 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/6a0b7e44/attachment.htm>


More information about the users mailing list