Передача переменных из GUI в текущую рабочую область, MATLAB - PullRequest
0 голосов
/ 20 июня 2020

Я разработал приложение с помощью конструктора приложений, который запускает файл .m при нажатии кнопки. Но перед этим выполнением я просматриваю некоторые файлы xlsx и сохраняю там данные в некоторых переменных, и я использую функцию assignin для экспорта этих переменных. Эти переменные, в свою очередь, используются в сценарии (файл .m). Но я заметил, что эти переменные присутствуют в базовом рабочем пространстве, которое отличается от текущего рабочего пространства. Есть ли способ передать их в текущую рабочую область.

assignin("base",'name',name2)

Это просто след GUI

classdef app < matlab.apps.AppBase

    % Properties that correspond to app components
    properties (Access = public)
        UIFigure        matlab.ui.Figure
        ContinueButton  matlab.ui.control.Button
        Button          matlab.ui.control.Button
        Button2         matlab.ui.control.Button
        Button3         matlab.ui.control.Button
    end

    
  
    

    % Callbacks that handle component events
    methods (Access = private)

        % Code that executes after component creation
        function startupFcn(app)
            %app.ds
            %uiwait(app.UIFigure);
        end

        % Button pushed function: ContinueButton
        function ContinueButtonPushed(app, event)
            name = 'string';
            assignin("base",'name',name)
            run("trail.m")
            closereq
            %set(handle.Operation)
        end

        % Close request function: UIFigure
        function UIFigureCloseRequest(app, event)
            delete(app)
            %uiresume(app.UIFigure);
        end
    end

    % Component initialization
    methods (Access = private)

        % Create UIFigure and components
        function createComponents(app)

            % Create UIFigure and hide until all components are created
            app.UIFigure = uifigure('Visible', 'off');
            app.UIFigure.Position = [100 100 640 480];
            app.UIFigure.Name = 'MATLAB App';
            app.UIFigure.CloseRequestFcn = createCallbackFcn(app, @UIFigureCloseRequest, true);
            app.UIFigure.Pointer = 'hand';

            % Create ContinueButton
            app.ContinueButton = uibutton(app.UIFigure, 'push');
            app.ContinueButton.ButtonPushedFcn = createCallbackFcn(app, @ContinueButtonPushed, true);
            app.ContinueButton.Position = [164 106 262 92];
            app.ContinueButton.Text = 'Continue';

            % Create Button
            app.Button = uibutton(app.UIFigure, 'push');
            app.Button.Position = [454 254 100 22];

            % Create Button2
            app.Button2 = uibutton(app.UIFigure, 'push');
            app.Button2.Position = [104 254 100 22];
            app.Button2.Text = 'Button2';

            % Create Button3
            app.Button3 = uibutton(app.UIFigure, 'push');
            app.Button3.Position = [301 335 100 22];
            app.Button3.Text = 'Button3';

            % Show the figure after all components are created
            app.UIFigure.Visible = 'on';
        end
    end

    % App creation and deletion
    methods (Access = public)

        % Construct app
        function app = app

            % Create UIFigure and components
            createComponents(app)

            % Register the app with App Designer
            registerApp(app, app.UIFigure)

            % Execute the startup function
            runStartupFcn(app, @startupFcn)

            if nargout == 0
                clear app
            end
        end

        % Code that executes before app deletion
        function delete(app)

            % Delete UIFigure when app is deleted
            delete(app.UIFigure)
        end
    end
 end

Это файл скрипта trail.m

%%%%%%%%%%%%%%%%%%%% trail.m %%%%%%%%%%%%%%%%%%%%%%%

clc;clear

suma = 90;
sumb = 100;
total = suma+sumb;

disp(name);

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Эта функция:

   function ContinueButtonPushed(app, event)
        name = 'string';
        assignin("base",'name',name)
        run("trail.m")
        closereq
        %set(handle.Operation)
    end

может быть упрощена до:

   function ContinueButtonPushed(app, event)
        name = 'string';
        trail
        closereq
        %set(handle.Operation)
    end

Потому что команда trail запускает сценарий trail.m, а сценарии совместно используют рабочее пространство вызывающего. Таким образом, он увидит локальную переменную name.

Убедитесь, что в вашем скрипте trail не очищены все переменные: удалите строку clc;clear. В противном случае вы очищаете переменную name, которую пытаетесь использовать!

1 голос
/ 21 июня 2020

Используйте дескрипторы, а не переменные или assignin.

Вместо того, чтобы пытаться назначать переменные непосредственно в рабочей области (что является продвинутым, хрупким методом), я предлагаю вам использовать передачу по ссылке Объект стиля handle для передачи значений между вашей основной функцией и вашими обратными вызовами GUI. Подойдет объект containers.Map (поскольку это дескриптор), или вы можете определить собственный класс, используя classdef MySharedData < handle. Создайте объект в своей функции вызова и сохраните его там в переменной. Затем прикрепите объект в appdata к одному из дескрипторов фигуры, который виден вашим GUI функциям обратного вызова. Чтобы передать данные обратно в вызывающую / основную функцию, пусть ваш GUI обратный вызов назначит или обновит значения / свойства в вашем общем объекте дескриптора.

Или вы можете просто вставить значения непосредственно в appdata на вашем GUI ручки. Они также действуют как дескрипторы, и это традиционный способ Matlab передачи данных между вызывающей функцией и GUI обратными вызовами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...