Précédent   Forum des professionnels en informatique > Environnements de développement > MATLAB > Interfaces Graphiques
Interfaces Graphiques Forum d'entraide sur les interfaces graphiques en MATLAB
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/01/2012, 16h18   #1
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : mars 2010
Messages : 60
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2010
Messages : 60
Points : 25
Points : 25
Par défaut Callback check button

Bonjour,

Mon problème doit être assez proche de http://matlab.developpez.com/faq/?pa...radio_exclusif mais je ne comprend pas comment l'appliquer.

J'ai deux cases à cocher et je voudrais qu'en sélectionnant la première la seconde (voir 2,3 ou 4 autres check button) se décoche et inversement. Mon problème est que la valeur de ma seconde case n'est pas détecté dans la fonction callback...

Voici mon code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
handles.CheckBox_Patient = uicontrol(gcf, ...
    'style', 'checkbox', ...
    'position',[ 25 300 50 30   ],...
    'BackgroundColor','white',...
    'string','Tous',...
    'Value',1,...
    'tag','checkPatTous',...
    'HorizontalAlignment','left');
set(handles.CheckBox_Patient, 'Callback', @checkbox_callback);
set(findobj(handles.CheckBox_Patient, '-property', 'Units'), 'Units', 'normalized');

% CheckBox Type IMAGE
handles.CheckBox_Pat_H = uicontrol(gcf, ...
    'style', 'checkbox', ...
    'position',[ 25 230 30 20   ],...
    'BackgroundColor','white',...
    'string','H',...
    'Value',0,...
    'tag','checkH',...
    'HorizontalAlignment','left');
set(handles.CheckBox_Pat_H, 'Callback', @checkbox_callback);
set(findobj(handles.CheckBox_Pat_H, '-property', 'Units'), 'Units', 'normalized');

checkbox_callback(handles.CheckBox_Pat_H , handles.CheckBox_Patient)
La fonction checkbox_callback :

Code :
1
2
3
4
5
6
7
8
9
function checkbox_callback(composant1,composant2)

get(composant1,'value')
get(composant2,'value')
% get(composant2,'Value')
% if get(composant1,'Value')==1
%     set (composant2,'Value',0)
% end
end
Et ce que me renvoie matlab :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ans =
     0
ans =
     1
ans =
     []
ans =
     0
ans =
     []
ans =
     1
ans =
     []
>>
TheDwarf01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 16h33   #2
Dut
Rédacteur/Modérateur
 
Avatar de Dut
 
Inscription : novembre 2006
Messages : 12 915
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 12 915
Points : 15 889
Points : 15 889
Voici une version corrigée :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
handles.CheckBox_Patient = uicontrol(gcf, ...
    'style', 'checkbox', ...
    'position',[ 25 300 50 30   ],...
    'BackgroundColor','white',...
    'string','Tous',...
    'Value',1,...
    'tag','checkPatTous',...
    'HorizontalAlignment','left');

% CheckBox Type IMAGE
handles.CheckBox_Pat_H = uicontrol(gcf, ...
    'style', 'checkbox', ...
    'position',[ 25 230 30 20   ],...
    'BackgroundColor','white',...
    'string','H',...
    'Value',0,...
    'tag','checkH',...
    'HorizontalAlignment','left');

set([handles.CheckBox_Patient handles.CheckBox_Pat_H],...
    'Callback', {@checkbox_callback, handles.CheckBox_Patient, handles.CheckBox_Pat_H}, ...
    'Units', 'normalized')

checkbox_callback([],[],handles.CheckBox_Pat_H , handles.CheckBox_Patient)
Code :
1
2
3
4
function checkbox_callback(obj,event,composant1,composant2)

get(composant1,'value')
get(composant2,'value')
__________________
Mes contributions MATLAB (R2009a - Windows & Linux)

• J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" (Saint Huck)
• Des larmes coulèrent doucement des yeux fermés du vieil homme. Moi je pleurais comme un enfant, que d'ailleurs pour lui je ne cesserais d'être ma vie durant (Amkoullel)

• Lâché de Mogwai sur St Malo... aie aie aie... ouille ouille ouille
Dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 16h52   #3
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : mars 2010
Messages : 60
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2010
Messages : 60
Points : 25
Points : 25
Grand MERCI,

Pourrai tu juste m'expliquer la différence entre nos deux versions qui fait que l'une marche et pas l'autre, histoire que je comprenne d'où vienne l'erreur...

Pour la fonction callback
Code :
function checkbox_callback(obj,event,composant1,composant2)
Quel est l'utilité des variables 'obj' et 'event' ?
TheDwarf01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 17h06   #4
Dut
Rédacteur/Modérateur
 
Avatar de Dut
 
Inscription : novembre 2006
Messages : 12 915
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 12 915
Points : 15 889
Points : 15 889
Il y a plusieurs syntaxes possibles pour les Callback.

La plus courante est la suivante :
Code :
set(handle, 'Callback', @mycb);
Dans ce cas, la fonction mycb reçoit uniquement 2 arguments d'entrée obligatoires que l'on nomme obj et event ou hObject et eventdata :

Code :
function mycb(obj, event)
Avec :
  • obj : identifiant (handle) de l'objet parent du Callback
  • event : une structure contenant des événements (souvent vide) issus de Java

Pour passer des arguments supplémentaires, on écrit :
Code :
set(handle, 'Callback', {@mycb, arg1, arg2, arg3);
et donc naturellement :
Code :
function mycb(obj, event, arg1, arg2, arg3)
__________________
Mes contributions MATLAB (R2009a - Windows & Linux)

• J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" (Saint Huck)
• Des larmes coulèrent doucement des yeux fermés du vieil homme. Moi je pleurais comme un enfant, que d'ailleurs pour lui je ne cesserais d'être ma vie durant (Amkoullel)

• Lâché de Mogwai sur St Malo... aie aie aie... ouille ouille ouille
Dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 17h10   #5
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : mars 2010
Messages : 60
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2010
Messages : 60
Points : 25
Points : 25
Oki, je prends note

Merci
TheDwarf01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 17h14   #6
Dut
Rédacteur/Modérateur
 
Avatar de Dut
 
Inscription : novembre 2006
Messages : 12 915
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 12 915
Points : 15 889
Points : 15 889
Au passage, les CheckBox ne sont pas destinés à une sélection exclusive, c'est le rôle des objets RadioButton.

D'où l'utilité de la méthode décrite en tout fin de l'entrée de la FAQ que tu as mentionnée précédemment.
__________________
Mes contributions MATLAB (R2009a - Windows & Linux)

• J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" (Saint Huck)
• Des larmes coulèrent doucement des yeux fermés du vieil homme. Moi je pleurais comme un enfant, que d'ailleurs pour lui je ne cesserais d'être ma vie durant (Amkoullel)

• Lâché de Mogwai sur St Malo... aie aie aie... ouille ouille ouille
Dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 18h18   #7
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : mars 2010
Messages : 60
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2010
Messages : 60
Points : 25
Points : 25
Non je suis obligé de passer par des check buttons car uniquement mon bouton 'Tous' doit être exclusif par rapport aux autres 'choix1' 'choix2' ...

Est ce que le fait d'utiliser les handlers dans les paramètres de la fonction rendrais celle ci plus robuste ?
Code :
1
2
checkbox_callback([],[],handles.CheckBox_Pat_H , handles.CheckBox_Patient);
Parce que pour le moment cette ligne ne me sert à rien et j'ai un léger problème dans le cas ou si tous mes boutons ne sont pas cochés alors il faut activer 'Tous'
TheDwarf01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 21h17   #8
Dut
Rédacteur/Modérateur
 
Avatar de Dut
 
Inscription : novembre 2006
Messages : 12 915
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 12 915
Points : 15 889
Points : 15 889
Essaie ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
figure

handles.h(1) = uicontrol(gcf, ...
    'style', 'checkbox', ...
    'position',[ 25 300 50 30   ],...
    'BackgroundColor','white',...
    'string','Tous',...
    'Value',1,...
    'tag','checkPatTous',...
    'HorizontalAlignment','left');

handles.h(2) = uicontrol(gcf, ...
    'style', 'checkbox', ...
    'position',[ 25 230 30 20   ],...
    'BackgroundColor','white',...
    'string','H',...
    'Value',1,...
    'tag','checkH',...
    'HorizontalAlignment','left');

handles.h(3) = uicontrol(gcf, ...
    'style', 'checkbox', ...
    'position',[ 25 160 30 20   ],...
    'BackgroundColor','white',...
    'string','I',...
    'Value',1,...
    'tag','checkI',...
    'HorizontalAlignment','left');

handles.h(4) = uicontrol(gcf, ...
    'style', 'checkbox', ...
    'position',[ 25 90 30 20   ],...
    'BackgroundColor','white',...
    'string','J',...
    'Value',1,...
    'tag','checkJ',...
    'HorizontalAlignment','left');

set(handles.h,...
    'Callback', {@checkbox_callback, handles.h}, ...
    'Units', 'normalized')
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function checkbox_callback(obj,event,composants)

if strcmp(get(obj,'tag'),'checkPatTous')
    if get(obj,'value')
        set(composants,'value',1);
    else
        set(composants,'value',0);
    end
else
    v = get(composants(2:end),'value');
    if all([v{:}])
        set(composants(1),'value',1);
    else
        set(composants(1),'value',0);
    end
end
La fonction du Callback peut se simplifier en :

Code :
1
2
3
4
5
6
7
8
function checkbox_callback(obj,event,composants)

if strcmp(get(obj,'tag'),'checkPatTous')
    set(composants,'value',get(obj,'value'));
else
    v = get(composants(2:end),'value');
    set(composants(1),'value',all([v{:}]));
end
Mais je persiste dans mon idée que ce n'est pas ergonomique.

Je ferais plutôt comme ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
figure

handles.h(1) = uicontrol(gcf, ...
    'style', 'radiobutton', ...
    'position',[ 25 300 50 30   ],...
    'BackgroundColor','white',...
    'string','Tous',...
    'Value',1,...
    'tag','checkPatTous',...
    'HorizontalAlignment','left');

handles.h(2) = uicontrol(gcf, ...
    'style', 'radiobutton', ...
    'position',[ 25 270 50 30   ],...
    'BackgroundColor','white',...
    'string','Indiv',...
    'Value',0,...
    'tag','checkPatIndiv',...
    'HorizontalAlignment','left');

handles.h(3) = uicontrol(gcf, ...
    'style', 'checkbox', ...
    'position',[ 25 230 30 20   ],...
    'BackgroundColor','white',...
    'string','H',...
    'Value',1,...
    'enable','off', ...
    'tag','checkH',...
    'HorizontalAlignment','left');

handles.h(4) = uicontrol(gcf, ...
    'style', 'checkbox', ...
    'position',[ 25 160 30 20   ],...
    'BackgroundColor','white',...
    'string','I',...
    'Value',1,...
    'enable','off', ...
    'tag','checkI',...
    'HorizontalAlignment','left');

handles.h(5) = uicontrol(gcf, ...
    'style', 'checkbox', ...
    'position',[ 25 90 30 20   ],...
    'BackgroundColor','white',...
    'string','J',...
    'Value',1,...
    'enable','off', ...
    'tag','checkJ',...
    'HorizontalAlignment','left');

set(handles.h,...
    'Callback', {@check_callback, handles.h}, ...
    'Units', 'normalized')
Et :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function check_callback(obj,event,composants)

if strcmp(get(obj,'tag'),'checkPatTous')
    if get(obj,'value')
        set(composants(3:end),'value',1,'enable','off');
        set(composants(2),'value',0);
    else
        set(composants(3:end),'value',1,'enable','on');
        set(composants(2),'value',1);
    end
    
elseif strcmp(get(obj,'tag'),'checkPatIndiv')
    if get(obj,'value')
        set(composants(3:end),'enable','on');
        set(composants(1),'value',0);
    else
        set(composants(3:end),'value',1,'enable','off');
        set(composants(1),'value',1);
    end
else
    v = get(composants(2:end),'value');
    if all([v{:}])
        set(composants(1),'value',1);
    else
        set(composants(1),'value',0);
    end
end
Enfin c'est l'idée...
__________________
Mes contributions MATLAB (R2009a - Windows & Linux)

• J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" (Saint Huck)
• Des larmes coulèrent doucement des yeux fermés du vieil homme. Moi je pleurais comme un enfant, que d'ailleurs pour lui je ne cesserais d'être ma vie durant (Amkoullel)

• Lâché de Mogwai sur St Malo... aie aie aie... ouille ouille ouille
Dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 13h21   #9
Nouveau Membre du Club
 
Homme
Étudiant
Inscription : mars 2010
Messages : 60
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2010
Messages : 60
Points : 25
Points : 25
Merci , grâce à toi j'ai compris l'utilité des handlers et j'ai suis enfin arrivé à ce que je voulais. Pour les boutons poussoirs dans mon cas ça n'aurai pas été super pratique, ci après une partie de mon interface :



Voici mon nouveau code :


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function checkbox_callback(obj,event,composants)

if strcmp(get(obj,'tag'),'checkTestTous')
    if get(obj,'value')
        set(composants,'value',1);
        set(composants(2:end),'value',0);
    else
        set(composants,'value',1);
        set(composants(2:end),'value',0);
    end
else
    v = get(composants(2:end),'value');
    
    if  all ([v{:}])==1
        set(composants(1),'value',1);
        set(composants(2:end),'value',0);
    else
        set(composants(1),'value',0);
    end
    
    if ~get(composants(2),'value')&& ~get(composants(3),'value') ...
            && ~get(composants(4),'value') && ~get(composants(5),'value') ...
            && ~get(composants(6),'value') && ~get(composants(7),'value') ...
            && ~get(composants(8),'value')
        
        set(composants(1),'value',1);
        
    end
end
Par contre get(composant(X:end)) me renvoie un cell du coup j'ai du mettre tout en dur pour un test booléen...
TheDwarf01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 14h06   #10
Dut
Rédacteur/Modérateur
 
Avatar de Dut
 
Inscription : novembre 2006
Messages : 12 915
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 12 915
Points : 15 889
Points : 15 889
Tu gagnerais en ergonomie en utilisant des objets Uipanel pour mieux structurer les différentes zones de ton interface :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
fig = figure('color','w');

w = .3;
x = (1-3*.3)/4;

uipanel(fig,'title','Sélection patients',...
    'backgroundcolor','w',...
    'units','normalized',...
    'position',[x .5 w .5])

uipanel(fig,'title','Arboresence patients',...
    'backgroundcolor','w',...
    'units','normalized',...
    'position',[x .38 3*w+2*x .1])

uipanel(fig,'title','Tests à effectuer',...
    'backgroundcolor','w',...
    'units','normalized',...
    'position',[w+2*x .5 w .5])

uipanel(fig,'title','Administration',...
    'backgroundcolor','w',...
    'units','normalized',...
    'position',[2*w+3*x .5 w .5])

axes('units','normalized',...
'position',[x .05 2*w+x .3],'box','on')

uicontrol('string','Go','units','normalized',...
    'position',[2*w+3*x .1 w .1])
Images attachées
Type de fichier : png interface.png (1,5 Ko, 8 affichages)
__________________
Mes contributions MATLAB (R2009a - Windows & Linux)

• J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" (Saint Huck)
• Des larmes coulèrent doucement des yeux fermés du vieil homme. Moi je pleurais comme un enfant, que d'ailleurs pour lui je ne cesserais d'être ma vie durant (Amkoullel)

• Lâché de Mogwai sur St Malo... aie aie aie... ouille ouille ouille
Dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h56.


 
 
 
 
Partenaires

Hébergement Web