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

Antoine Monmayrant amonmayr at laas.fr
Fri Nov 29 10:20:50 CET 2019


Le Jeudi, Novembre 28, 2019 19:40 CET, Claus Futtrup <cfuttrup at gmail.com> a écrit: 
 
> Hi Antoine
> 
> Also, you should better use get(a, 'propertyName') or set(a, 'propertyName', value) instead of a.propertyName and a.propertyName=value in your callbacks.
> 
> 
> I see what you mean. I just now had trouble turning visibility on/off, 
> but using set(), it works fine. Thanks for the tip.

It's something quite weird, maybe a race condition.
I've seen it when using 'a.prop' or 'a.prop=value' syntax in either a callback function or in a for loop.
When you repeatedly use this syntax, scilab tends to forget that 'a' exists and that it's a handle with different properties.
The initial bug report is here: http://bugzilla.scilab.org/show_bug.cgi?id=15786
Not much progress because I never managed to get a minimal working example (it's an Heisenbug).

Antoine

> 
> Best regards,
> Claus
> 
> On 28.11.2019 17:47, Antoine Monmayrant wrote:
> > Le Jeudi, Novembre 28, 2019 17:05 CET, Claus Futtrup <cfuttrup at gmail.com> a écrit:
> >   
> >> 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);
> > You are right.
> > Also, the trick to disable the callback function/ reenable it is key for sliders that tend to generate an avalanche of call to the function when one moves the cursor.
> >
> >> 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.
> > I think you can achieve what you want by setting ".visible='off'" for all the uicontrols you don't want to show initialy. You can then set  ".visible='on'" after the first call to the callback (or at each call if you are lazy).
> >
> >> 3) I will look into this. Thanks for the tip.
> > Also, you should better use get(a, 'propertyName') or set(a, 'propertyName', value) instead of a.propertyName and a.propertyName=value in your callbacks.
> > I have found that this latter syntax is causing a lot of bug if your callback get called really often. I still don't know why.
> >
> >> 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?
> > Hmm, that would be a good idea.
> > I'll see whether I can put something together.
> > The thing is, MVC approach looks rather silly and overengineered on a small example.
> >
> >> 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
> >>
> > _______________________________________________
> > users mailing list
> > 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
>




More information about the users mailing list