How do you use App designer to read files from a folder and then present those files in the gui for the user to select one or multiple from?
85 次查看(过去 30 天)
显示 更早的评论
Hi, I am very new to the App designer and creating gui's. I already have existing code for a system but now I wish to create a gui from it and in turn make the system more useable and flexible.
I wish for the gui to read in a set of files from a specific folder and then display those files as tick boxes so the user can tick one or more of the files. The ticked files will then be used in future functions. How do I do this?
The files and number of files will essentially be an input into the top-level function.
Thanks
0 个评论
回答(2 个)
Image Analyst
2022-12-14
You need to create a listbox where the user can click on the files to process. Then in the opening code, load up the listbox with code like this.
% Specify top level folder and file pattern.
topLevelFolder = pwd; % Or whatever you want.
filePattern = fullfile(topLevelFolder, '*.dat')
% Get a list of all files in that folder and within its subfolders.
ds = fileDatastore(filePattern, 'ReadFcn', @readmatrix)
allFileNames = ds.Files
app.Listbox.Text = allFileNames; % Or maybe it's app.Listbox.String -- I don't recall.
Then in your "Go!" button, or however you start your batch process, you need to get the Value of the listbox to determine which items were selected, and get the Text property to get all the file names, then loop over selected indexes getting the current data filename and doing something with it.
0 个评论
Voss
2022-12-14
Here's a function (select_files) you can refer to when working on your app (or use this as-is).
It uses a uitable and a uicontrol. You can use a uitable in an appdesigner app, but you can't use a uicontrol; you'd have to use a uibutton (of style 'push') instead.
Example usage:
% call select_files with all the files in the current directory:
files = dir('*.*');
files([files.isdir]) = [];
files_to_use = select_files({files.name});
The function code:
function selected_files = select_files(files)
if ischar(files)
files = {files};
end
files = files(:);
Nfiles = numel(files);
f = figure( ...
'Name','Select File(s)', ...
'NumberTitle','off', ...
'HandleVisibility','off', ...
'IntegerHandle','off', ...
'DockControls','off', ...
'Toolbar','none', ...
'Menubar','none');
f_pos = get(f,'Position');
t = uitable( ...
'Parent',f, ...
'Units','normalized', ...
'Position',[0 0.2 1 0.8], ...
'Data',[num2cell(false(Nfiles,1)) files], ...
'ColumnEditable',[true false], ...
'ColumnWidth',{25 f_pos(3)-42}, ...
'ColumnName',{'' 'File'}, ...
'ColumnFormat',{'logical' 'char'}, ...
'RowName',{});
uicontrol( ...
'Parent',f, ...
'Units','normalized', ...
'Position',[0.8 0.05 0.15 0.1], ...
'Style','pushbutton', ...
'String','OK', ...
'FontSize',10, ...
'Callback',@cb_ok);
selected_files = {};
waitfor(f);
function cb_ok(~,~)
data = get(t,'Data');
selected_files = files([data{:,1}]);
delete(f);
end
end
2 个评论
Voss
2024-11-19,15:54
function select_all(~,~) t.Data(:,1) = {true}; end
That function should be nested inside the select_files function (like cb_ok is), and it can be a callback of a "select all" button or other control you add.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Migrate GUIDE Apps 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!