MATLAB GUIDE gui listbox间歇性地消失,看似过时的错误

时间:2010-08-12 05:58:36

标签: matlab user-interface race-condition matlab-guide intermittent

我正在使用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)。

非常感谢有关此主题的任何想法或信息!


编辑:感谢米哈伊尔,我似乎解决了这个问题。我在这里发布我的代码以供将来参考。

经过大量的调试打印和疯狂点击后,我发现有时候当您询问列表框选择的内容时,会得到一个空的结果。这个问题和其他问题使事情变得混乱。我把所有的写作交互都放到了一个集中的函数中,然后我编写了一些测试代码,以确保事情保持原样。

请注意,这已经在我自己的环境中(在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 个答案:

答案 0 :(得分:2)

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

这是应该如何运作的:

对于Popup和单选List List string属性必须不为空,即有一些内容。但默认情况下它是空的,因此必须始终定义它。

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

在空数组中取第一个元素显然不起作用,因此无法呈现控件!

您的列表框控件是单选 - 其属性min&lt; maxvalue是标量且&gt; 0。如果属性min&gt;列表框(但不是弹出窗口)可以是多选的max,在这种情况下,value可以是一个数组(也暗示也是空的),而空string不会导致问题。

阅读有关uicontrol属性的string, value, min, max, listboxtop

的MATLAB帮助

在实践中

  • 你说它在用GUIDE编辑后显现出来。 GUIDE创建代码隐藏。编辑旧代码后,有时仍然存在。
  • 有时MATLAB对一个语句中的顺序很敏感,即set(hlist, 'value', 2, 'string', {'aa','bb'})value足够长并使uicontrol无效之前将天真2设置为string
  • MATLAB是错误的,每年两次的新版本会删除旧版本并带来新的错误。如果您确定调试模式不能正常工作那么就是MATLAB支持的情况。我有相同的代码运行m代码,p代码和编译的exe - 相同的代码行为不同,主要是在GUI的工作方式。

答案 1 :(得分:2)

根据我的经验,当value属性大于列表框中的条目数时,通常会发生此错误。因此,无论何时重新填充列表框,都应更新value属性 - 出于安全原因将其设置为1.

除此之外,请查看@Mikhail的优秀评论。