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 <[email protected]> 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"); >
ar_gui.sce
Description: application/scilab-sce
_______________________________________________ users mailing list [email protected] http://lists.scilab.org/mailman/listinfo/users
