getting the result from one gui to another gui in matlab - matlab

I have two GUI's, 1 main and the other the sub GUI. I want to have the result from the main gui to be displayed in the text box in the sub GUI.
I connected my main gui to the sub gui by adding this:
openfig subgui.fig
I know that this wont do, I'm new in matlab. To display the result in the main gui i have:
set(handles.edit1,'String',f);
f represents the result that i want to be displayed in the other gui.

You need a global variable.
Let’s say that we have
a main GUI named main.m (with an associated main.fig) with one editbox (main_edit) and one pushbutton
a sub GUI named sub.m (with an associated sub.fig) with one editbox (sub_edit) that will get the value form the editbox in main
In main.m
Step 1. Inside the editbox’s callback, add the following:
global my_data;
my_data.main.main_edit = get(hObject, ‘String’);
Step 2. Inside the pushbutton’s callback, add the following just before it’s return:
global my_data;
sub;
delete(handles.main_figure);
In sub.m, inside the opening function, sub_OpneningFcn, add the following:
global my_data;
set(handles.sub_edit, ‘String’, my_data.main.main_edit);
Let me know if it works for you!
Also, there are some awesome videos that you can check released by MathWorks Engineers, here is one video that can help you: http://www.mathworks.com/matlabcentral/fileexchange/8616-video--guide-advanced-techniques

Reverie - the line of code
openfig subgui.fig
will just open the GUI/figure and NOT launch the GUI in a way that can it can be used. While opening it will display the GUI with all of its controls, you will get errors (to the effect of Attempt to reference field of non-structure array.) as soon as you try to use it. Instead, launch the GUI by name as
subgui
which will be sufficient to start the sub-gui in a working manner.
Now, in order to pass information from one GUI to the other, you can try the following. Assuming that you are using GUIDE to create your main and sub GUIs (which seems valid since you have a figure for the GUI), open the property inspector for the figure of each GUI and set the HandleVisibility property to on. At the same time, assign a Tag for each, perhaps MainGui for the main GUI, and SubGui for the sub GUI.
Now, you can use the findobj function to find the other GUI using its tag. Suppose then, that we launch the sub GUI from a pushbutton callback of the first GUI like
function pushbutton1_Callback(hObject, eventdata, handles)
% launch the sub GUI
% NOTE - you may want code here to check to see if the GUI is already open before
% launching it again
subgui;
% find the handle to the subgui
hSubGui = findobj('Tag','SubGui');
if ~isempty(hSubGui)
% get the handles structure of the sub GUI
hSubGuiHandles = guidata(hSubGui);
% get the data from the main GUI to pass to the sub GUI
value = get(handles.edit1,'String');
% now update an equivalent edit text field in the other GUI
set(hSubGuiHandles.edit1,'String',value);
end
In the above we use findobj to find the GUI we are interested in using its Tag property. If we have found this GUI (and so hSubGui is non-empty) then we get its handles structure so that we can update its edit text field with the data in the main GUI.

Related

Selection Callback for text input

I'm using MATLAB GUIDE to build a GUI to control a piece of hardware. I have a data table the user needs to fill, and every time they select a cell a new configuration is sent to the hardware. This is easily done using the CellSelectionCallback().
However, I also have a single reference value that is currently being entered into an edit textbox. I would like for the GUI to send a new configuration to the hardware whenever a user selects the textbox, but before they enter their new value. Is there a similar SelectionCallback function that can be used for the textbox? The best solution I've come up with is to create a 1x1 table instead of an edit box.
Your best bet is going to be to use a Java control since the standard MATLAB uicontrol does not have a focus callback. You can use a JTextField object, add it to your GUI with javacomponent and then register the FocusGainedCallback.
jtext = javax.swing.JTextField();
jtext.setHorizontalAlignment(javax.swing.JTextField.CENTER);
% Add the control to your GUI
htext = javacomponent(jtext, [10 10 200 10]);
% Register a callback to be executed when the box is selected
set(htext, 'FocusGainedCallback', #yourCallback)

How do I mimic a button click in matlab

How do I mimic a button click in matlab?
Simply excecuting the callback function doesn't work since within its callback it uses the gcbo command and I cannot alter the excecuting function. I furthermore would not like to shadow gcbo for obvious reasons.
In case it matters I look for a solution which works on matlab R2012a.
you can try calling the java.awt.Robot class, for example.
robot = java.awt.Robot;
pause(2) % wait some time
robot.keyPress (java.awt.event.KeyEvent.VK_ENTER); % press "enter" key
robot.keyRelease (java.awt.event.KeyEvent.VK_ENTER); % release "enter" key
read more about GUI automation using a Robot here...
I'm not sure this will work on Matlab R2012a, but it does on later versions.
gcbo only contain the button handle. If you have (or can retrieve/find) the button handle, just call the function callback with the button handle as first argument and an empty variable as the second argument.
something looking like that:
button_callback( buttonHandle , [] ) ;
The callback will not make any difference between gcbo or the button handle and will function exactly the same.
If you do not have the button handle in the first place, you can try to find it with findobj:
buttonHandle = findobj(gcf,'Style','PushButton','String','The Button Text')
Depending on how the GUI was built/defined, then handle visibility may not be immediately apparent, in which case you can search deeper with findall:
buttonHandle = findall(gcf,'Style','PushButton','String','The Button Text')
or may be the handle was nicely saved in the guidata structure:
handles = guidata(gcf) ;
and search the structure for what may be your button handle.
Note: in the last 3 examples above, make sure the GUI figure which contains the button has the focus before you call gcf, or better yet, replace gcf by the actual figure handle.

how to hide existing uicontrol in Matlab before printing figure?

I am using a Matlab based program that does some nice plots of some model results. It adds uicontrol slides and buttons in figures. I have no expierence with gui programming in Matlab, and I dont need it, I just wanna add on my matlab script a couple of lines to hide slides and buttons. I can do it manually from the property editor and set "Visible" to "off", but I was reading the Matlab manual and it does not explain how to retrieve an existing uicontrol and change its properties. Any hint? I tried this with no luck:
b = get(gcf,'uicontrol');
set(b,'Style','pushbutton','Visible','off');
Thanks
You simply need to access the element from the handles structure and change its property from there.
For example, if the pushbutton is stored in the handles structure like this:
handles.b %// Whatever name you gave it and see in the Property Inspector
you can make it not visible using the command
set(handles.b,'Visible','off')
and likewise for every other properties.
Little trick: If you need to repeatedly turn on and off elements of your GUI, you can put them in an array of handles for example in the Opening_Fcn of the GUI and change them all at once using this array anywhere in the GUI. This way you won't have to always call them one by one which can be tedious.
Example:
handles.AllButtons = [handles.button1; handles.button2; handles.button3]
this contains the handles to 3 pushbuttons let's say. Now if yu need to turn them all off/on at the same time, you can do:
set(handles.AllButtons,'Visible','off')
instead of doing
set(handles.button1,'Visible','off')
set(handles.button2,'Visible','off')
set(handles.button3,'Visible','off')
From GUIDE, you can check the actual name of any uicontrol component in the Property Inspector. Here is a screenshot from a GUI I made with GUIDE:
In this case, the Tag associated with the button is pushbutton28_ReferenceChannelApply.
Therefore, in order to change any of its properties I would need to use:
set(handles.pushbutton28_ReferenceChannelApply,'Property','value')
EDIT 2
You can look for pushbuttons in your GUI with the findobj command like so:
FindButtons = findobj('Style','push')
which will output an array of handles to those pushbuttons. Then you can query their properties using the get command:
get(FindButtons(1))

MATLAB: Toolbar pushbutton not receiving updated strings from figure handles.

I have a GUI with an edit box and a push button on the tool bar (well, more things than that, but those are the only things that matter!) Anyway, I have it so when you press the push button tool a variable is set to equal the string in the edit box. A simple var = get(handles.edit1, 'string'). However, when I go straight from entering the value in the box to clicking the pushbutton (without clicking anywhere else or pressing return), var is assigned the previous value in the edit box. Why is this? Is there any way to make sure the push button tool will pick out the correct value?
The GUI was made using guide, if that matters.
This is happening because the uipushtool callback is executing before the text box has time to 'validate'. There is surely a more elegant way to do that but this trick works:
You can use the waitfor command to tell the uipushtool callback to wait for the editable box to validate its input. Unfortunately is is not exactly enough so we'll have to:
1) pass the focus to a dummy control (I created a dummy pushbutton named pushbutton1 which does nothing. The focus could be send to any other dummy control.
2) now wait for the text box to validate its content.
3) When the text box is done, then retrieve the content the traditional way.
This method requires:
- A dummy control to send the focus to (but you can use a real one too)
- An dummy (or not) callback function for your editable box. (the waitfor instruction will wait for the callback to finish, if there is no callback, it will error
function uipushtool1_ClickedCallback(hObject, eventdata, handles)
uicontrol( handles.pushbutton1 ) ; %// pass the focus to a dummy control
waitfor(handles.edit1,'String'); %// wait for the editable box to validate its content
var = get(handles.edit1, 'string') ; %// now retrieve the editable box content
set( handles.text1 , 'String' , var ) %// this can be deleted, just to verify the method
% --------------------------------------------------------------------
function edit1_Callback(hObject, eventdata, handles)
%// This is the dummy callback function for the editable box
%// Do absolutely nothing here (or do if you want ... your choice)
EDIT
as I feared, my initial solution was too dirty to be robust enough. With 2 (or more) textboxes, I tried a large number of things but without success. I dropped the waitfor, I noticed that in some case, when the uipushtool was pressed, the callback of the editbox would fire but the uipushtool would not execute at all ... so i tried to managed things directly from the editbox callback => from the editbox keypressedFcn send each character as we type to a variable ... but even this editbox callback doesn't know the content of the edit box at the time it is executed ?? (This link provide a very simple example to reproduce that).
So to my great own disappointment, I had to resort to an 'external' solution. (If you accept that it becomes very simple though). The trick is to retrieve the handle of the Java EditBox object. Once we have the handle, getting the "real time" content is just matter of converting the Java string into a Matlab string.
To retrieve the Java object handles, you need the function FindJObj from Matlab central.
Put that anywhere in your matlab path, then the code for your pushbutton become something like :
To make sure there was no interferences between the text boxes and the uipushtools I made 2 separate uipushtools each controlling 1 editbox
function uipushtool1_ClickedCallback(hObject, eventdata, handles)
jEditbox = findjobj(handles.edit1); %// get the handle of the java editbox #1
var = char(jEditbox.getText) ; %// retrieve Java string and convert it to matlab string
disp(['uipushtool1_ClickedCallback running. Textbox1 content = ' var ]) %// debug line, you can delete or comment that
% --------------------------------------------------------------------
function uipushtool2_ClickedCallback(hObject, eventdata, handles)
jEditbox = findjobj(handles.edit2); %// get the handle of the java editbox #2
var = char(jEditbox.getText) ; %// retrieve Java string and convert it to matlab string
disp(['uipushtool2_ClickedCallback running. Textbox2 content = ' var ]) %// debug line, you can delete or comment that
Thanks to Yair Altman for the findjobj function, and many other contributions for Matlab users.
I tried to replicate your problem and created a new GUI using guide with only a pushbutton and an edit field. If I set the button callback to:
function pushbutton1_Callback(hObject, eventdata, handles)
get(handles.edit1,'string')
it always prints the current value of the edit field, no matter if I click somewhere else after entering the value or not. Which version of Matlab are you using? I've tested it using Matlab 2010a.

Matlab GUI: Dynamically changing the popup menu

I have a GUI that I want to add a popup menu to it.
The popup menu fields that should be shown are saved in the file targets.txt.
When I open my program, I want the popup menu to include the lines from the mentioned file above.
I'm doing this because I want the popup menu to change dynamically in the program. Since it will include directories paths that the user entered in another field, I'm saving the directories paths in a file, and each time a user enters a folder, I set the popup menu according to the file. (I did it and it works fine)
Since function myFunction_OpeningFcn(hObject, eventdata, handles, varargin) is called only after calling the "create function" of each component of the GUI, I couldn't do the initialization in the "opening function" of the program. Instead, I had to to something like this:
function databaseMenu_CreateFcn(hObject, eventdata, handles)
if ispc&&isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
handles.databaseMenuObject=hObject; % (1) see below
guidata(hObject, handles);
(1): I save the popup menu object in handles so that I can use it in the opening function.
And then, in the opening function I can do:
fid_r = fopen('targets.txt', 'r');
C = textscan(fid_r, '%s');
set(handles.databaseMenuObject,'String', C{1});
So, when someone adds a new "database" folder in the program, the popup menu changes (I add the folder that was chosen by the user to the file, and then I set the popup menu to have its field from the file (the function above). So it'll look like that:
I don't like the design of my code, and I couldn't figure out how to do it in a different way, is there a way to make the "create function" of the "popup menu" to be called after the "opening function" of the program? Or is there a better way to achieve my goal?
Background
A few things that may be helpful:
You can define additional functions as needed within a GUI; you are not limited to the callbacks defined.
Tagging figure elements makes them easy to find from any callback.
gcbf returns the current callback figure.
union can return the union of cell arrays of strings.
Suggestions
Here is how I might write such a function. This puts everything in one place, the function can be called from anywhere within your GUI, it automatically updates the cached list, and eliminates any duplicate entries.
You would call this code at the end of your init code, as well as the callback for adding folders. The Tag can be set by right-clicking and setting properties within GUIDE.
updatePopupMenu()
popupMenuHandle = findobj(gcbf,'Tag','myPopupMenuTag');
popupMenuContents = get(popupMenuHandle,'String');
% Initialization
if isempty(popupMenuContests)
fid_r = fopen('targets.txt', 'r');
C = textscan(fid_r, '%s');
popupMenuContents = C{1};
end
% Join
otherFields = howeverYouGetFieldsFromOtherList();
combinedContents = union(popupMenuContents, otherFields);
% Save
set(popupMenuHandle,'String', combinedContents);
fid_w = fopen('targets.txt','w+');
for i = 1:length(combinedContents)
fprintf(fid_w,'%s\n',combinedContents{i});
end
fclose(fid_w);
end
Alright I now understand what you want to achieve, though I am not sure whether I understand the problem I hope this helps:
Judging from the description this seems like a logical order for things to happen:
1: Initalization, just initialize everything, you already know that you will have a dropdown menu but you just don't know the content yet. Therefore just start with a defaultoption or empty (possibly invisible).
2: Update, As soon as the users saves new input, you update the list.