필터 지우기
필터 지우기

Closing all figures, but not GUI

조회 수: 53 (최근 30일)
Khawaja Asim
Khawaja Asim 2012년 5월 27일
답변: Gordon Fox 2023년 2월 21일
How do I use "close command" to close all the other figures, but not the main GUI?
Actually here is a case in which a main GUI is opened and some other figures too. If I use "close all" it closes all figures including the GUI. Show me a way to close only the other figures.

채택된 답변

Image Analyst
Image Analyst 2012년 5월 27일
I think you should be able to set handle visibility of your gui to 'off' then close all (which now won't see your figure) then turn it back on. You can do this:
set(handleToYourMainGUI, 'HandleVisibility', 'off');
close all;
set(handleToYourMainGUI, 'HandleVisibility', 'on');
Here's a fully tested demo, guaranteed to work:
% Open 8 figures.
figure(1);
% Create figure 2 and get it's handle.
% We're not interested in getting the handles of the other figures.
h2 = figure(2);
figure(3);
figure(4);
figure(5);
figure(6);
figure(7);
figure(8);
% Now close all except figure 2.
% First make figure 2 invisible.
set(h2, 'HandleVisibility', 'off');
% Close all visible figures. This won't include figure 2
uiwait(msgbox('Click OK to close all but figure 2'));
% Close all visible figures. This won't include figure 2
close all;
% Now make figure 2's handle visible again.
set(h2, 'HandleVisibility', 'on');
  댓글 수: 4
Image Analyst
Image Analyst 2016년 12월 14일
If you want to make your axes vanish with GUIDE, I think the best way is to make the axes contained within a panel and then set the visibility of the panel to 'off'. Simply setting the visibility of the axes or doing "axis off" doesn't seem to work because the axes is a whole bunch of things, namely the x and y axes themselves, the tick marks and tick labels, the contents of the axes (line plots, images, text strings, etc.), the title, the x and y labels, etc. You'd have to set all of those things' visibility. It's much easier to just put the whole thing into a panel and set the panel visibility with one call.
R G
R G 2016년 12월 15일
편집: R G 2016년 12월 15일
i am really not sure about that. But i think close clause also kill Guide panel. So even if i set visibility off for any panel on Guide, it will be closed also. I think I need to set visibility off for Guide or I need another "close clause" what kill only figure but not Guide, right.

댓글을 달려면 로그인하십시오.

추가 답변 (7개)

Omri Mamo
Omri Mamo 2016년 12월 14일
편집: Omri Mamo 2016년 12월 14일
I think the best way to do it is by the 'Tag' property:
% get( handles.output , 'Tag' ) is the 'Tag' of the GUI
Figures = findobj( 'Type', 'Figure' , '-not' , 'Tag' , get( handles.output , 'Tag' ) );
NFigures = length( Figures );
for nFigures = 1 : NFigures;
close( Figures( nFigures ) );
end;
  댓글 수: 1
Allen
Allen 2017년 8월 17일
Omri,
I was using a similar approach in looking for figures and closing only those without tags, albeit your approach is much more elegant. I like the way you used the inclusive/exclusive features in findobj(...). Your method can also be simplified to the following:
if true
% get( handles.output , 'Tag' ) is the 'Tag' of the GUI
Figures = findobj('Type','Figure','-not','Tag',get(handles.output,'Tag'));
close(Figures)
end

댓글을 달려면 로그인하십시오.


per isakson
per isakson 2012년 5월 27일
There is no simple way to do that in Matlab.
In the FEX there are some contribution, which try to provide help, e.g. fig.m / closefig.m and Close all figures except those listed. There are more.
You can make your own function. Here is something to getting started. Put it under a shortcut on the toolbar. Refine it successively to meet new needs. Replacing findobj with findall might not be a good idea.
function keep_guis
fig_h = permute( findobj( 0, 'Type', 'Figure' ), [2,1] );
for fh = fig_h
uih = findobj( fh, 'Type', 'uicontrol' );
if isempty( uih )
delete( fh );
end
end
end
Here a GUI is defined as a figure with a visible uicontrol.

Khawaja Asim
Khawaja Asim 2012년 5월 27일
I have done this now using "close 1"
this closes the Figure 1. Every time displaying a new figure, I write this.. this closes the Figure 1 and opens every new figure as Figure 1... :P
what you say about this trick?? :P
  댓글 수: 4
Khawaja Asim
Khawaja Asim 2012년 5월 27일
@Image Analyst: I have noticed that you are very quick in logic making and algo developing... I am working on retina images for Optic Disc detection and Fovea detection. I almost have completed my work.. Now working on GUI to make it presentable for demonstration......... Have you also worked in this field? To which university or institute you belong?
Image Analyst
Image Analyst 2012년 5월 27일
I have a Ph.D. in optics. During my Ph.D. I worked on a laser scanning ophthalmoscope for a year or two, though my main research was in radiology. I do algorithm development (and GUI development) full time as my job and have been doing to for over 30 years. I develop apps for other people in our company to run to do their own image analysis. I don't want the tedious job of analyzing their images - I'll leave that up to them and I'll just develop the program for them. You can look up my profile to get as much information as I want to share publicly. I work in the USA. Good luck in your research.

댓글을 달려면 로그인하십시오.


Mike Swickrath
Mike Swickrath 2016년 12월 1일
Hi all,
I had a different situation. I have figure numbers that dynamically change. Depending on the user, and their session in the GUI I developed, the figure numbers take on integer values in an arbitrary way (...an artifact of not knowing I would want to close all open figures except the GUI before I started programming the GUI).
Many of the solutions above probably would have worked in my case if I would have identified a need for this functionality about 5000 lines of code before now. Alas, I am in a different situation and needed to be a little more creative. I hope this helps some of you.
Anyway, my solution was to use a combo of Daniel's technique along with a technique to count figures posted elsewhere ( counting figures ).
Mike
% Detect all figures - close the figures that are not the GUI
fh=findall(0,'type','figure');
fh=findobj(0,'type','figure');
nfh=length(fh); % Total number of open figures, including GUI and figures with visibility 'off'
% Scan through open figures - GUI figure number is [] (i.e. size is zero)
for i = 1:nfh
% Close all figures with a Number size is greater than zero
if sum(size(fh(i).Number)) > 0
figure(fh(i).Number);
close(gcf);
end
end
  댓글 수: 2
Larry McDermott
Larry McDermott 2017년 1월 10일
Mike: Your code was exactly what I was looking for, worked like a charm! Thanks!
Larry
Bhavanithya Thiraviaraja
Bhavanithya Thiraviaraja 2022년 11월 16일
Thank you this worked for me.
Additional tip: If you don't want the figure to pop up in the line figure(fh(i).Number), you can just give close(fh(i).Number) directly

댓글을 달려면 로그인하십시오.


Daniel
Daniel 2014년 5월 14일
I was using the publish command to write hundreds of figures into an HTML file. I found the accepted answer here to be problematic then. But I used a neat work-around:
In case you are able to count the number of figures, which should be rather straight forward by using a global parameter that can be increased in any function where you are plotting figures, there is a very simple trick to close all figures except the GUI.
for i = 1:no_of_open_figures
close(gcf)
end
This trick is based on the assumption that all your figures will be on top of the GUI, which should always be the case except if there is interaction with the GUI between plotting.

Andreas Martin
Andreas Martin 2018년 5월 9일
I use the following code to close all figures but first:
h = findall( 0, 'type', 'figure' ); % Find all figures
h = setdiff( h, 1 ); % Exclude first figure (1)
h.delete % Delete 'em

Gordon Fox
Gordon Fox 2023년 2월 21일
I had the same issue with a GUI and fixed it by including the following setting in the main GUI figure creation.
'HandleVisibility', 'callback'

카테고리

Help CenterFile Exchange에서 Subplots에 대해 자세히 알아보기

태그

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by