Есть ли способ конвертировать строку в вызов функции внутри GUI Matlab? - PullRequest
0 голосов
/ 25 апреля 2019

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

Таким образом, мой вопрос; Как я могу преобразовать строку в функцию, чтобы она могла вызывать другой графический интерфейс в Matlab?

Я пытаюсь построить графический интерфейс в приложении Matlab. Идея состоит в том, что функция запуска графического интерфейса вызывает настраиваемую функцию с именем AutomaticUpdate. Эта функция ищет в определенном общем каталоге самую новую версию. (например, GUI_v1_1 посмотреть, присутствует ли GUI_v1_2 или выше в заданном каталоге). Когда функция AutomaticUpdate найдена, она копирует эту новую версию из общего каталога в каталог, из которого она запускается. Теперь я хочу, чтобы GUI_v1_1 автоматически запускал GUI_v1_2 после его копирования.

Процесс копирования графического интерфейса пользователя из общего каталога в тот, из которого запускается «старый» графический интерфейс пользователя, основан на сравнении чисел, присутствующих в заголовках графического интерфейса, путем преобразования заголовков в строки, а затем выбора и сравнения числа в этой строке. Новейшая версия, доступная в общем каталоге, может быть выбрана и скопирована таким образом. Теперь у меня есть название GUI в строковом формате, но чтобы открыть его в GUI, мне нужно иметь его в формате функции. Копирование имени GUI в функцию запуска GUI вручную после его копирования (т.е. GUI_v1_2) работает и запускает второй GUI. Взятие строки непосредственно после того, как GUI был скопирован, и применение str2func к этой строке не.

Это работает (если графический интерфейс пользователя, который был только что скопирован из общей папки, был назван TestApp_v1_2):

   function startupFcn(app)
       if haveInet
           fname = AutomaticUpdate2();
       end
   AppTest_v1_2
   end

Это не:

   function startupFcn(app)
       if haveInet
           fname = AutomaticUpdate2();
       end
   str2func(fname)
   end

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

1 Ответ

3 голосов
/ 25 апреля 2019

используйте str2func для построения дескриптора функции (вместо eval)

Вы наполовину ошибаетесь, когда говорите «, это не работает » во втором фрагменте кода. Просто вы еще не закончили вызывать функцию:

str2func(fname)

само по себе ничего не делает видимым. Он только создает дескриптор функции fname, но поскольку вы вызываете строку без какого-либо выходного аргумента, созданный дескриптор теряется, как только заканчивается выполнение строки.

Теперь, если вы попробуете:

myNewUpdatedApp = str2func(fname) ;

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

myNewUpdatedApp = str2func(fname) ; % create the function handle (pointer to funtion)
myNewUpdatedApp ;                   % call the execution of the function

Я советую вам прочитать о:

  • str2func (который всегда предпочтительнее eval, даже есть глава, сравнивающая эти два параметра на странице документации).
  • Функциональные ручки . Очень полезные мелочи, особенно в таких случаях, как ваш.
...