【问题标题】:load folder's images names to a Matlab listbox将文件夹的图像名称加载到 Matlab 列表框
【发布时间】:2015-01-25 18:00:52
【问题描述】:

我正在尝试将我使用 matlab GUI 选择的特定文件夹中存在的所有图像名称加载到列表框中。

问题是当我选择文件夹时:

如果它是空的,我可以看到带有白色背景颜色的空列表(这是正确的)。

但是当我选择一个包含图像的文件夹时,列表框会从 GUI 中消失。我收到一条警告:

警告:单选列表框控件需要一个标量值

控件在其所有参数值都有效之前不会被渲染

我被这个问题困扰了很长时间,我找不到解决方法。

这是我尝试过的代码:

 % --- Load up the listbox with tif files in folder handles.handles.ImageFolder
function handles=LoadImageList(handles) 

    ListOfImageNames = {};
    folder = handles.ImageFolder;



    if ~isempty(handles.ImageFolder) 
        if exist(folder,'dir') == false
            warningMessage = sprintf('Note: the folder used when this program was last run:\n%s\ndoes not exist on this computer.\nPlease run Step 1 to select an image folder.', handles.ImageFolder);
            msgboxw(warningMessage);
            return;
        end
    else
        msgboxw('No folder specified as input for function LoadImageList.');
        return;
    end
    % If it gets to here, the folder is good.


    ImageFiles = dir([handles.ImageFolder '/*.*']);
    for Index = 1:length(ImageFiles)
        baseFileName = ImageFiles(Index).name;
        [folder, name, extension] = fileparts(baseFileName);
        extension = upper(extension);
        switch lower(extension)
        case {'.png', '.bmp', '.jpg', '.tif', '.avi'}
            % Allow only PNG, TIF, JPG, or BMP images
            ListOfImageNames = [ListOfImageNames baseFileName];
        otherwise
        end
    end
    set(handles.lstImageList,'string',ListOfImageNames);


    return

【问题讨论】:

    标签: matlab listbox matlab-guide


    【解决方案1】:

    当某些参数设置为无效值时,Matlab uicontrol 会发生这种情况。 Matlab 选择不显示它们。

    在您的情况下,错误消息告诉您Value 参数不正确。

    您的listbox 被定义为“单选”,这意味着您一次只能选择一行。 Value 参数表示选择的行号。此参数必须是“标量”、单个数字,而不是代表选定多行的向量(可能与“多选”列表框一起使用)。

    注意,Matlab 也不支持空的Value,所以如果你的Value 设置为[],当你填充lisbox 时也会出错。 (至少在我的 R2009a 版本上没有

    解决这个问题的简单方法是在填充listbox 的同时设置Value

    set(handles.lstImageList,'string',ListOfImageNames,'Value',1);
    

    【讨论】:

    • 非常感谢@Hoki ...这正是我想要的..它工作正常。感谢您的帮助
    【解决方案2】:

    问题在于您创建ListOfImageNames 的方式。您的代码的结果是一个长字符串,其中包含所有图像名称,没有任何空格或分隔符。
    MATLAB 的 listboxString 属性需要一个带有每行条带的元胞数组。你可以试试这个:

    ListOfImageNames =[];
    NumOfImages = 0;
    ImageFiles = dir([handles.ImageFolder '/*.*']);
    for Index = 1:length(ImageFiles)
        baseFileName = ImageFiles(Index).name;
        [folder, name, extension] = fileparts(baseFileName);
        extension = upper(extension);
        switch lower(extension)
        case {'.png', '.bmp', '.jpg', '.tif', '.avi'}
            % Allow only PNG, TIF, JPG, or BMP images
            NumOfImages = NumOfImages + 1;
            ListOfImageNames{NumOfImages} = baseFileName;
        otherwise
        end
    end
    set(handles.lstImageList,'string',ListOfImageNames);
    

    【讨论】:

    • 一开始我也怀疑过,但我运行了他的代码,他的列表构建工作正常。它返回一个字符串元胞数组。
    • 好吧,我运行了它,它返回了一个长字符串,并且代码产生了与 OP 相同的警告。也许它依赖于 matlab 版本/操作系统?
    • 非常感谢您回答我的问题。我的数组没有任何问题,因为我认为我可能有那个错误,但是当我返回它的值时;它工作正常。 @Hoki 给了我答案。非常感谢
    • @ThP。它可能确实取决于上下文。我不得不说我也会以不同的方式构建单元阵列。请注意,在您构建它的方式中,您不需要NumOfImages 计数器,您可以使用ListOfImageNames(end+1) = { baseFileName } ;(前提是您之前先将其初始化为一个空单元格数组,就像他所做的那样:ListOfImageNames = {};
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2019-02-13
    相关资源
    最近更新 更多