3

J'ai créé un matfile dans lequel je stocke des données qui sont constamment remplacées par le comportement de l'utilisateur. Cela se produit dans une fonction "test()".Comment mettre à jour un uitable après la création à partir d'autres fonctions?

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 

Ensuite, je veux afficher ces données dans une autre fonction (il est essentiel d'avoir deux fonctions séparées) appelé « storageTest() ». Plus particulièrement, storageTest() est une fonction d'interface graphique où j'ai développé un "t". Donc, j'appelle d'abord la fonction "test()" et donne ses valeurs de sortie en tant que données de "t". Voici le code de la partie intéressante de « 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 

Ce code exécute uniquement lorsque « m = test() » cours d'exécution est terminée et me affiche un onglet dans lequel je peux voir la valeur finale de " n ". Cependant, je veux que ma table soit affichée avant et pour voir ma valeur s'incrémenter selon le comportement de l'utilisateur. J'ai cherché sur le web pour résoudre mon problème, mais je ne trouve aucune réponse, est-il possible de faire une telle chose?

Répondre

2

En supposant que j'interprète correctement à la question, il devrait être assez trivial pour accomplir si vous initialisez votre table avant d'appeler test puis passez la poignée à votre table pour test mettre à jour dans la boucle while:

Par exemple:

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 

Lorsque vous exécutez ce qui précède, vous remarquerez les données de votre itérer de table comme prévu.

+0

Merci beaucoup @excaza! Cependant, pensez-vous que je peux encore stocker les données? Mon but, en utilisant un matfile était de garder un enregistrement des valeurs variables "n" (je veux le faire parce que je veux savoir à quel moment l'utilisateur a fait cette action, donc c'est important pour moi). –

+0

@ManaV oui, votre code n'a pas besoin de changer de ce que vous avez fourni ci-dessus, juste l'ajout de 't.data = quelquechose 'à' test' et l'initialisation 't' avant d'appeler' test' et de passer '' t' à test' (ou en utilisant [réponse de thewaywewalk] (http://stackoverflow.com/questions/32145207/how-to-update-a-uitable-after-creation-from-other-functions/32145884#32145884), qui fonctionne de manière similaire). – excaza

2

excaza était un peu plus vite par écrit essentiellement la même réponse comme moi. Comme il semble un peu différent, je l'afficherai quand même.

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 

Le "comportement utilisateur" J'imitait avec la fonction input. L'idée de base est de mettre à jour votre table depuis test(). evalin vous pouvez utiliser, si vous ne voulez pas passer les paramètres à test(), mais en passant directement le handle de l'uitable est certainement la meilleure option.

Si vous travaillez sur un projet sérieux GUI je vous recommande fortement la lecture this answer.

+0

Great link, n'avait pas vu cette question avant! – excaza

+0

Merci @thewaywewalk, J'aimerais pouvoir choisir votre réponse comme la bonne! –

+0

Ne vous inquiétez pas excaza était plus rapide et les réponses sont fondamentalement les mêmes – thewaywewalk