Как обновить uitable после создания из других функций?

Я создал матфайл, в котором храню данные, которые постоянно перезаписываются поведением пользователя. Это происходит в функции "test()".

n=1
while n < 5 
    myVal = double(Test704(1, 780, -1)) %Returns the user's behavior
    if myVal == 1
        n = n + 1 %"n" is the overwritten variable in the matfile
    end

    save('testSave1.mat') %The matfile
    m = matfile('testSave1.mat')
end

Затем я хочу отобразить эти данные в другой функции (важно иметь две отдельные функции), называемой «storageTest()». В частности, storageTest() — это функция графического интерфейса, для которой я разработал подходящую букву «t». Итак, я сначала вызываю функцию "test()" и задаю ее выходные значения как данные "t". Вот код интересной части «storageTest»:

m = test()
    d = [m.n]
    t = uitable('Data',d, ...
        'ColumnWidth',{50}, ...
        'Position',[100 100 461 146]);
    t.Position(3) = t.Extent(3);
    t.Position(4) = t.Extent(4);

    drawnow

Этот код выполняется только после завершения "m = test()" и отображает мне вкладку, в которой я могу увидеть окончательное значение "n". Однако я хочу, чтобы моя таблица отображалась раньше и чтобы мое значение увеличивалось в соответствии с поведением пользователя. Я искал в Интернете, чтобы решить мою проблему, но я не нашел ответа, возможно ли это сделать?


person Mana V    schedule 21.08.2015    source источник


Ответы (2)


Предполагая, что я правильно интерпретирую вопрос, это должно быть довольно тривиально, если вы инициализируете свою таблицу до вызова test, а затем передаете дескриптор своей таблицы для test для обновления в цикле while:

Например:

function testGUI
% Initialize table
t = uitable('ColumnWidth',{50}, 'Position',[100 100 461 146]);
test(t)

function test(t)
n = 1;
while n < 5
    n = n + 1;
    t.Data = n;
    pause(0.25); % Since we're just incrementing a number, a slight so we can actually see the change
end

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

person excaza    schedule 21.08.2015
comment
Большое спасибо @excaza! Однако, как вы думаете, я все еще могу хранить данные? Моя цель с помощью матфайла заключалась в том, чтобы вести запись значений переменной n (я хочу сделать это, потому что хочу знать, в какое время пользователь выполнил это действие, поэтому это важно для меня). - person Mana V; 21.08.2015
comment
@ManaV да, ваш код не должен отличаться от того, что вы предоставили выше, просто добавление t.data = whatever к test и инициализация t перед вызовом test и передача t в test (или использование ответ thewaywewalk, который работает аналогично). - person excaza; 21.08.2015

excaza был немного быстрее в написании практически того же ответа, что и я. Так как он выглядит немного иначе, я все равно опубликую его.

function storagetest()
    close all
    f = figure;
    data = [1];
    t = uitable(f,'Data',data,'ColumnWidth',{50});
    test()
end

function test()
    % handle uitable
    t = evalin('caller','t')

    n = 1;
    while n < 5
        newVal = input('Enter a number:');
        data = get(t,'Data');
        set(t,'Data', [data; newVal]);
        n = n + 1;
    end

end

«Поведение пользователя», которое я имитировал с помощью функции input. Основная идея состоит в том, чтобы обновить вашу таблицу изнутри test(). evalin вы можете использовать, если вы не хотите передавать параметры в test(), хотя передача дескриптора uitable напрямую, безусловно, является лучшим вариантом.

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

person thewaywewalk    schedule 21.08.2015
comment
Отличная ссылка, не видел этот вопрос раньше! - person excaza; 21.08.2015
comment
Спасибо, @thewaywewalk, я бы тоже хотел выбрать ваш ответ как правильный! - person Mana V; 26.08.2015
comment
Не волнуйтесь, excaza был быстрее, и ответы в основном одинаковы. - person thewaywewalk; 26.08.2015