MATLAB GUIDE gui 列表框间歇性消失,并出现看似过时的错误
-
27-09-2019 - |
题
我正在使用 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)中进行了测试,但并未进行广泛测试。另外,代码有点多余,但无论如何让我感觉很好。(IE。 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
解决方案
这是一个已知的编程错误,与竞争条件无关!
它应该是这样工作的:
对于弹出和单选列表 string
属性必须不为空,即有一些内容。但默认情况下它是空的,因此必须始终定义它。
在弹出窗口中显示(在列表中突出显示)项目由两个属性定义 string
(作为字符串元胞数组)和 value
(这是 1
默认情况下)。
获取空数组中的第一个元素显然不起作用,因此无法呈现控件!
您的列表框控件是单选的 - 它的属性 min
< max
和 value
是标量且 >0。如果属性允许,列表框(但不是弹出窗口)可以进行多项选择 min
> max
, , 在这种情况下 value
可以是一个数组(这也意味着空)和空 string
不会造成问题。
阅读 MATLAB 帮助以了解 uicontrol 属性 string, value, min, max, listboxtop
在实践中
- 你说它在用GUIDE编辑后就显现出来了。GUIDE 创建代码隐藏。编辑后,旧的代码隐藏有时仍保留在原处。
- 有时 MATLAB 对一条语句内的顺序很敏感,即
set(hlist, 'value', 2, 'string', {'aa','bb'})
天真地设定value
到2
前string
足够长并且会使 uicontrol 无效。 - MATLAB 是有 bug 的,每个新版本每年两次都会删除旧版本并带来新的 bug。如果您确定调试模式无法正常工作,则需要 MATLAB 支持。我运行与 m 代码、p 代码和编译的 exe 相同的代码 - 相同的代码的行为不同,主要是 GUI 的工作方式不同。
其他提示
根据我的经验,此错误最常发生在以下情况: value
属性大于列表框中的条目数。因此,每当您重新填充列表框时,您都应该更新 value
属性 - 出于安全原因将其设置为 1。
除此之外,请查看以下优秀评论 @米哈伊尔.