[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