【问题标题】:How to remove GUI element from Octave figure?如何从 Octave 图中删除 GUI 元素?
【发布时间】:2019-10-20 11:42:04
【问题描述】:

Octave 相对较新,我正在创建一个简单的图形窗口,其中包含轴对象中的绘图和一些可以操纵绘图的 uicontrol 对象。到目前为止,一切都非常简单,我制作了图形、轴和 uicontrols

figure(1, 'position', ...
h.ax = axes(...
h.button = uicontrol('style', 'pushbutton', 'string', 'press me', 'callback', @func)
h.label = uicontrol(...
guidata(gcf, h)

问题来自我的一个按钮回调。按下按钮时,不仅绘图会改变,而且我需要从 gui 中删除其中一个元素,例如 uicontrol 标签。我发现从图形窗口中获取 gui 元素的唯一方法是删除 uicontrol 对象,所以我的回调看起来像

function func (obj)
  h = guidata(obj);

  delete(h.label);
  ...

  guidata(obj, h);
endfunction

这会产生“错误:guidata:H 必须是图形回调函数中的有效对象句柄执行错误”。

我怀疑我的错误对于掌握 Octave / Matlab 中图形句柄如何工作的人来说是显而易见的。这对了解问题所在有很大帮助。

【问题讨论】:

  • 您的代码看起来不错。唯一需要两个参数的回调函数:对象和事件。除了这个错误,我可以在 MATLAB 中运行我们的代码。

标签: matlab user-interface octave


【解决方案1】:

您可以将其visible 属性设置为off,而不是删除uicontrol 对象。这样,uicontrol 仍然存在,只是你看不到它。

来自https://octave.org/doc/v4.2.0/Uicontrol-Properties.html

visible: "off" | {"on"}

如果可见是“off”,则uicontrol 不会呈现在屏幕上。

【讨论】:

    【解决方案2】:

    您的代码不完整,因此我无法评论特定的错误......但是,此代码对我有用(以八度为单位):

    function testo()
      figure(1, 'position', [10, 10, 400, 400]);
      h.ax = axes('position', [0,0,1,1]);
      h.button = uicontrol('style', 'pushbutton', 'string', 'press me', 'position', [10, 50, 100, 50], 'callback', @func);
      h.label1 = uicontrol('style', 'text', 'string', 'label1', 'position', [120, 50, 100, 50]);
      h.label2 = uicontrol('style', 'text', 'string', 'label2', 'position', [230, 50, 100, 50]);
      guidata(gcf, h)
    endfunction
    
    function func (obj,evnt)
      h = guidata(obj);
      delete(h.label1);
      guidata(obj, h);
    endfunction
    

    请注意,如果您再次按下该按钮,则会收到您看到的错误消息。因此,问题可能不在于删除标签本身,而是您删除了实际上不存在的其他内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      相关资源
      最近更新 更多