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

P M p.muehlmann at gmail.com
Thu Nov 28 10:53:47 CET 2019


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>:

> 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/d4812608/attachment.htm>


More information about the users mailing list