38 views (last 30 days)
Show older comments
Akshat on 24 Jun 2024 at 17:57
-
-
Link
Direct link to this question
https://www.mathworks.com/matlabcentral/answers/2131546-how-to-put-a-timeout-to-ginput
Edited: Akshat about 13 hours ago
Accepted Answer: Sudarsanan A K
Open in MATLAB Online
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.
Thanks in advanced
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
0 Comments Show -2 older commentsHide -2 older comments
Show -2 older commentsHide -2 older comments
Sign in to comment.
Sign in to answer this question.
Accepted Answer
Sudarsanan A K on 25 Jun 2024 at 10:03
Open in MATLAB Online
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
The following resources are useful for further explorations:
- https://www.mathworks.com/help/matlab/creating_plots/capturing-mouse-clicks.html
- https://www.mathworks.com/help/matlab/creating_plots/create-callbacks-for-graphics-objects.html
- "uiwait": https://www.mathworks.com/help/matlab/ref/uiwait.html
- "uiresume": https://www.mathworks.com/help/matlab/ref/uiresume.html
I hope this helps!
1 Comment Show -1 older commentsHide -1 older comments
Show -1 older commentsHide -1 older comments
Akshat about 13 hours ago
Direct link to this comment
https://www.mathworks.com/matlabcentral/answers/2131546-how-to-put-a-timeout-to-ginput#comment_3197021
Edited: Akshat about 13 hours ago
It worked, though i was looking for a one line solution like ginput only, this will do for now I guess. thanks.
Sign in to comment.
More Answers (0)
Sign in to answer this question.
See Also
Categories
MATLABGraphicsGraphics ObjectsGraphics Object Programming
Find more on Graphics Object Programming in Help Center and File Exchange
Tags
- ginput
- matlab
- matlab gui
- figure
- plot
- plotting
- function
- functions
- matlab function
- if statement
- input
- urgent
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- Deutsch
- English
- Français
- United Kingdom(English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)
Contact your local office