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 < amonm...@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 < > cfutt...@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@lists.scilab.org > http://lists.scilab.org/mailman/listinfo/users >
_______________________________________________ users mailing list users@lists.scilab.org http://lists.scilab.org/mailman/listinfo/users