Question
I want to show user a figure, and ask them to click somewhere within a stipulated time limit, like 2 seconds. I am using ginput as follows, but it seems to be pausing the execution before a button is pressed. I went to check in the ginput function and indeed it was using waitforbuttonpress. I tried some hands in getting a workaround but wasn't much succesfull to interrup ginput (specifically it's wfbp function). I am attaching a sample code what i need. I am okay in getting to know some work-arounds, even if they don't use ginput, but i'd still love to know what exactly could ba a solution if I were to use ginput. x = linspace(0,4*pi,2000);y=sin(x);plot(x,y);timeout=2;tic;[xt,yt]=ginput(1);if toc>2 xt=NaN; yt=NaN;end
Related Questions
Expert Answer
John Williams
PhD Expert
Answered Aug 13, 2026
Hi Akshat,
I understand that your goal is to show a figure and ask the user to click somewhere within a stipulated time limit (e.g., 2 seconds). The following approach would enable you achieve this:
- Plot the Figure: Plot the figure you wish to show the customer.
- Initialize Coordinates: Initialize "xt" and "yt" to "NaN".
- Create Click Flag: Create a flag "clicked" to check if the user has clicked.
- Create Timer: Create a timer object "t" with a "StartDelay" of "timeout" seconds. Set the "TimerFcn" to "uiresume(gcbf)", which resumes the figure's execution when the timer elapses.
- Start Timer: Start the timer with "start(t)".
- Set Mouse Click Callback: Set the "WindowButtonDownFcn" to "mouseClickFcn", which sets the "clicked" flag to "true" and resumes the figure's execution when the user clicks.
- Wait for User Input or Timeout: Use the "uiwait(gcf, timeout)" function to wait for the figure to be resumed by either the timer or the mouse click.
- Clean Up Timer: Stop and delete the timer object with "stop(t)" and "delete(t)".
- Check Click Flag: Check if the "clicked" flag is "true" to determine if the user clicked within the timeout period.
- Display Coordinates: Print the clicked coordinates to the console.
Here is an example:
timed_example(); function timed_example() x = linspace(0, 4*pi, 2000); y = sin(x); plot(x, y); timeout = 2; [xt, yt] = deal(NaN); % Initialize the coordinates % Create a flag to check if the user has clicked clicked = false; % Create a timer object to interrupt the execution after the timeout t = timer('StartDelay', timeout, 'TimerFcn', @(~,~) uiresume(gcbf)); start(t); % Set the WindowButtonDownFcn to capture the click and resume the figure set(gcf, 'WindowButtonDownFcn', @mouseClickFcn); % Wait for the figure to be resumed by either the timer or the mouse click uiwait(gcf, timeout); % Clean up the timer object stop(t); delete(t); % Display the clicked coordinates if clicked within the timeout if clicked fprintf('Clicked coordinates: (%f, %f)\n', xt, yt); else fprintf('No click detected within the timeout period.\n'); end function mouseClickFcn(~, ~) % Capture the coordinates of the click coords = get(gca, 'CurrentPoint'); xt = coords(1, 1); yt = coords(1, 2); clicked = true; uiresume(gcbf); end end
Have a different question? Ask here