Обратные вызовы для аргументов в Scilab - PullRequest
0 голосов
/ 21 февраля 2012

Я пишу графический интерфейс в Scilab и назначаю обратные вызовы для pushbutton элементов управления.Когда кнопка нажата, другой элемент управления затрагивается, например, текст внутри текстового поля изменяется.Сама вся эта подпрограмма (создание и инициализация GUI) живет внутри функции, то есть мне нужно вызвать мой create_my_gui(), чтобы запустить ее.

Моя проблема заключается в использовании переменной области действия и обратного вызова.Некоторые из моих кнопок влияют на несколько других элементов управления точно таким же образом, поэтому я хотел бы использовать ту же функцию обратного вызова и передать дескриптор элемента управления, на который я пытаюсь воздействовать, в обратный вызов.

Например, когдаЯ нажимаю N -ю кнопку, я хотел бы передать дескриптор N -й элемент управления в обратный вызов:

function buttonPressCallback  ( controlHandle )
    controlHandle.string = 'Button pressed!';
endfunction

Проблема в том, что обратные вызовыопределяются как строки:

myButton3.callback = 'buttonPressCallback ( myTextBox3 )'

И после того, как я запустил мою функцию create_my_gui(), все переменные выходят из области видимости и уничтожаются, включая дескрипторы для всех элементов управления.Когда я нажимаю кнопку, Scilab пытается запустить любую строку, указанную в качестве обратного вызова, и жалуется на переменную, например, myTextBox3, не существующую.

Есть ли способ ссылаться на uicontrols в Scilab послефункция, которая их создала, вышла?Я понимаю, что у Scilab есть очень своеобразные способы решения проблем, и, возможно, я просто пока не думаю о правильных шаблонах программирования Scilab.Есть ли «правильный» способ сделать это?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Нашли достойное решение.Каждый uicontrol может быть помечен путем установки myUicontrol.tag = 'my_tag';.Этот uicontrol может быть найден во всем мире, используя my_handle = findobj('tag','my_tag');.

0 голосов
/ 11 июля 2018

Вы можете получить доступ к вызывающему объекту uicontrol через gcbo, например:

get(gcbo,"value");
...