Как удалить элемент GUI из фигуры Octave? - PullRequest
0 голосов
/ 05 июня 2019

Относительно плохо знаком с 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)

Проблема связана с одним из моих обратных вызовов кнопок.Когда кнопка нажата, график не только изменяется, но мне нужно удалить один из элементов графического интерфейса, например, метку uicontrol.Единственный метод, который я нашел для получения элемента gui из окна рисунка, - это удалить объект uicontrol, поэтому мой обратный вызов выглядит примерно так:

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

  delete(h.label);
  ...

  guidata(obj, h);
endfunction

Это приводит к ошибке «guidata: H должно быть допустимымОшибка выполнения дескриптора объекта в графической функции обратного вызова ".

Я подозреваю, что моя ошибка станет очевидной для тех, кто понимает, как работают графические дескрипторы в Octave / Matlab.Было бы очень полезно понять, что происходит не так.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Ваш код не завершен, поэтому я не могу комментировать конкретную ошибку ... однако этот код работает для меня (в октаве):

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

Обратите внимание, что если вы нажмете кнопку еще раз, вы получите сообщение об ошибке. Поэтому, возможно, проблема заключается не в удалении метки как таковой, а в том, что вы удаляете что-то еще, чего на самом деле не существует.

0 голосов
/ 05 июня 2019

Вместо удаления объекта uicontrol вы можете просто установить для его свойства visible значение off.Таким образом, uicontrol все еще существует, вы просто не можете его увидеть.

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

visible: "off" |{"on"}

Если отображается "off", uicontrol не отображается на экране.

...