2012-02-01 3 views
1

J'ai un script ce script Matlab:bouton « essai suivant » dans Matlab

function semjudge 

clc; 

name = input('Name: ','s'); 
snum = input('Subject #: ','s'); 

files = dir(fullfile('pictures','*.png')); 
index = randperm(length(files)); 
picture1 = files(index(1)).name; 
picture2 = files(index(2)).name; 
image1 = fullfile('pictures',picture1); 
image2 = fullfile('pictures',picture2); 
subplot(1,2,1); imshow(image1); title(picture1); 
subplot(1,2,2); imshow(image2); title(picture2); 

uicontrol('Style', 'text',... 
     'Position', [200 45 200 20],... 
     'String','How related are these pictures?'); 
uicontrol('Style', 'text',... 
     'Position', [50 45 100 20],... 
     'String','Unrelated'); 
uicontrol('Style', 'text',... 
     'Position', [450 45 100 20],... 
     'String','Closely related'); 
uicontrol('Style','pushbutton','String','Next Trial',... 
     'Position', [250 350 100 20],... 
     'Callback','next'); 

h = uicontrol(gcf,... 
    'Style','slider',... 
    'Min' ,0,'Max',50, ... 
    'Position',[100 20 400 20], ... 
    'Value', 25,... 
    'SliderStep',[0.02 0.1], ... 
    'BackgroundColor',[0.8,0.8,0.8]); 

set(gcf, 'WindowButtonMotionFcn', @cb); 

lastVal = get(h, 'Value'); 

function cb(s,e) 
    if get(h, 'Value') ~= lastVal 
    lastVal = get(h, 'Value'); 
    fprintf('Slider value: %f\n', lastVal); 
    end 
end 

end 

Cela tire deux images aléatoires à partir d'un répertoire sur l'écran, avec une barre de défilement et des instructions pour déterminer le niveau de connexité/similarité entre les deux images avec une position sur la barre de défilement. C'est très bien. Ce que je veux, cependant, est de le régler de sorte que lorsque le bouton "Prochain Essai" est pressé, l'écran se réinitialisera, avec deux NOUVELLES images aléatoires, et la barre de défilement sera de retour au milieu. Comment puis-je faire cela? Je ne trouve aucune instruction sur la façon de le faire en ligne.

Répondre

2

Qu'en est-il quelque chose comme ceci:

uicontrol('Style','pushbutton','String','Next Trial','Position', [250 350 100 20],'Callback','clf; semjudge()'); 

clf pour effacer la fenêtre de la figure: http://www.mathworks.de/help/techdoc/ref/clf.html; et après votre fonction est simplement appelée à nouveau, ce qui va intriguer dans la fenêtre SAME!

+0

Parfait! Je vous remercie. La solution est toujours simple. Je ne connaissais pas la commande clf, et je pensais qu'en appelant une fonction, vous deviez utiliser le symbole "@", alors quand j'essayais d'appeler la fonction, ça ne fonctionnait pas! Merci encore. –

+1

Oui, vous pouvez également utiliser une fonction de rappel via l'opérateur '@'. Si vous le faites, n'appelez pas directement la fonction 'semjudge()' mais appelez une fonction supplémentaire qui utilise 'clf' (ou ferme complètement la fenêtre de la figure) et appelle ensuite' semjudge() ':) – tim