MATLAB GUIDE图形用户界面中的列表框间歇性消失,出现看似过时的错误。

6

我正在使用GUIDE构建一个简单的MATLAB GUI。我有一个项目列表框。大多数情况下,它按预期工作,但有时(通常在使用GUIDE编辑图形之后),填充列表框会导致它消失,同时出现以下消息:

Warning: single-selection listbox control requires a scalar Value
Control will not be rendered until all of its parameter values are valid 

这种行为让调试变得困难!当我逐步执行时,它按预期工作(我怀疑这是一种线程竞争或类似的东西)。此外,在相同条件下重新启动MATLAB环境后,通常会消失。

所有关于此错误的文档都是针对以前/古老版本的MATLAB(我正在使用R2010a)。

如果您有任何想法或信息,请告诉我们!


编辑:由于Mikhail的帮助,我似乎已经解决了问题。我在这里发布我的代码供将来参考。

经过大量的调试打印和疯狂点击,我发现有时当你询问列表框选择了什么时,你会得到一个空结果。这和其他问题使事情变得混乱。我将所有写入交互到列表框的操作移到了一个集中的函数中,并编写了一些测试代码来确保事情保持应该的状态。

请注意,这已在我的环境中进行了测试(在R2010a上),但并不广泛。此外,代码有点冗余,但它让我感觉很好。(即itemcount不能小于0 ...)

function ensure_listbox_ok(handles)

%check to make sure it does not suck - ask what it has
thestrings = get(handles.listbox_files, 'String');
selection = get(handles.listbox_files, 'Value');

itemcount = length(thestrings);

betterselection = selection;

if(itemcount <= 0)
    betterselection = 1;
else
    if(selection > itemcount)
        betterselection = itemcount;
    end
end

%never use zero!!!! even if 1 is out of bounds.
if(isempty(betterselection) || betterselection <= 0)
    betterselection = 1;
end

%uncomment for debug logging
%display(['Was: ' num2str(selection) ', cleaned: ' num2str(betterselection)]);

%update if we are out of bounds.
if(isempty(selection) || betterselection ~= selection)
    set(handles.listbox_files, 'Value', betterselection);
end
2个回答

2

这是一个已知的编程错误,与竞争条件无关!

应该这样工作:

对于弹出窗口和单选列表,string属性必须不为空,即必须有一些内容。但默认情况下为空,因此必须始终定义它。

在弹出窗口中显示(在列表中突出显示)的项目由两个属性string(作为字符串的单元格数组)和value(默认为1)定义。

显然,在空数组中取第一个元素是行不通的,因此无法渲染控件!

您的Listbox控件是单选的 - 其属性min<maxvalue是标量且>0。如果属性min>max,则Listbox(但不是Popup)可以是多选,此时value可以是数组(也意味着为空),而空的string不会引起问题。

阅读MATLAB帮助文件中的uicontrol属性string, value, min, max, listboxtop

在实践中

  • 您说它在使用GUIDE进行编辑后表现出来。GUIDE创建代码后端。在编辑旧的代码后端时,有时会保留在原地。
  • 有时MATLAB对一个语句内部的顺序很敏感,即set(hlist,'value',2,'string',{'aa','bb'})string足够长之前天真地将value设置为2并使uicontrol失效。
  • MATLAB存在缺陷,每年两次发布新版本会删除旧缺陷并引入新缺陷。如果您确定调试模式的工作方式不正确,则应向MATLAB支持寻求帮助。我拥有相同的代码运行为m-code、p-code和编译的exe - 相同的代码行为不同,主要是GUI的工作方式。

嗨,Mikhail,谢谢你的回答!我仍然想要更多的信息。你说listbox默认为空,但必须不为空...这是怎么回事??为什么有时候它对我有效,但并非总是如此?为什么我无法调试此错误?我相当确定我遵循了此uicontrol的所有指南,但在完全相同的条件下,它有时会崩溃。谢谢你的帮助! - eli
谢谢您提供的好建议。您显然在这方面非常有经验。您指引了我正确的方向,现在我更加仔细地处理列表框事务。我将发布另一个带有我的代码的答案,但是您获得了奖励=) - eli

2
根据我的经验,当value属性大于列表框中的条目数时,通常会出现此错误。因此,每当重新填充列表框时,您都应该更新value属性-出于安全考虑,将其设置为1。
除此之外,请查看@Mikhail提供的精彩评论。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接