• Aucun résultat trouvé

Positionnement et dimension des fenêtres et éléments graphiques En matière de GUI, on distingue sous MATLAB/Octave les deux systèmes d'axes suivants :

Dans le document Cours MATLAB et GNU Octave en pdf (Page 126-128)

X/Y écran : système dont l'origine se situe à l'angle inférieur gauche de l'écran et dont les unités sont en pixels (points écran)

X/Y fenêtre : système dont l'origine se situe à l'angle inférieur gauche de la fenêtre ; différentes unités sont possibles (voir plus bas la propriété 'units' de la fonction

uicontrol), les plus fréquemment utilisées étant : pixels (unité par défaut pour les uicontrol notamment)

"unités normalisées" (unité par défaut pour annotation) : c'est un système d'unité indépendant de la taille de la fenêtre pour lequel l'angle inférieur gauche est (0,0) et l'angle supérieur droite est aux coordonnées fenêtre (1,1)

Pour positionner et définir la taille d'une fenêtre, on doit spécifier les coordonnées écran (xf,yf) de son angle inférieur gauche, sa largeur dxf et sa hauteur dyf.

De même, pour positionner un contrôle graphique, on doit spécifier les coordonnées fenêtre (x1,y1) de son angle inférieur gauche, et sa largeur dx et hauteur dy, ou les coordonnées (x2,y2) de son angle supérieur droite.

Fenêtres GUI

dlg = figure('name','Titre', 'menubar','none', 'numbertitle','off' {, 'property', value ...} );

dlg = dialog('name','Titre', 'windowstyle','normal' {, 'property', value ...} );

Fait apparaître une fenêtre de dialogue vide avec le Titre spécifié, et retourne son handle dlg. Ces deux fonctions produisent le même résultat ! Pour figure : La propriété 'numbertitle','off' supprime le titre de fenêtre habituel "Figure numéro".

La propriété 'menubar','none' fait disparaître les menus et la barre d'outils habituels des fenêtres de figures.

Mais ne faites actuellement pas 'menubar','none' avec Octave Windows où un bug fait que les menus créés avec uimenu n'apparaissent alors pas.

Pour dialog : La propriété 'windowstyle','normal' est importante, sinon la valeur par défaut est 'modal' et on ne peut alors pas créer de menu.

Sous Octave Windows, ajoutez encore 'menubar','figure', sinon un bug fait que les menus créés avec uimenu n'apparaissent pas. Parmi les autres propriétés importantes mentionnons :

'position',[xf yf dxf dyf] : xf yf sont les coordonnées écran de l'angle inférieur gauche de la fenêtre, et dxf dyf la largeur et la hauteur de la fenêtre (en pixels)

'color',couleur : couleur du fonds de la fenêtre a) uiwait(dlg {,timeout})

b) uiresume(dlg)

a) Suspend l'exécution du programme tant que la fenêtre dlg n'est pas fermée ou que uiresume n'est pas appelé. Le programme est alors en attente d'événements (boucle d'événements) qu'il traitera avec les callbacks définis.

En spécifiant un timeout (en secondes), la suspension ne dure que le laps de temps spécifié.

b) Reprend l'exécution du programme qui a été suspendu avec uiwait. Cette fonction est en principe invoquée depuis un callback.

Voir aussi la fonction waitfor(control, 'property') qui reprend l'exécution du programme lorsque la propriété proprety de l'élément control est modifiée par l'utilisateur via un callback.

{event =} waitforbuttonpress

Suspend l'exécution du programme, et reprend celle-ci lorsque l'on clique dans la figure (retournant alors la valeur 0 sur event) ou que l'on frappe une touche au clavier (retournant 1 sur event).

Callbacks

Invocation d'un callback par un contrôle graphique ui_control (cela est aussi possible avec une fonction de dessin) :

a) ui_control(... , 'callback', 'code MATLAB/Octave' )

b) ui_control(... , 'callback', @fonction )

c) ui_control(... , 'callback', {@fonction, arg1, arg2 ...} )

a) Le callback est ici constitué par le code MATLAB/Octave défini sous forme de chaîne.

Ex: uicontrol('string','Fermer', 'position',[200 300 100 25], 'callback','close; disp(''bye'')');

Cette fonction crée un bouton (le 'style' par défaut étant 'pushbutton') nommé Fermer qui,

lorsqu'on clique dessus, referme la fenêtre (par un close) et affiche "bye" dans la console MATLAB/Octave.

b) Le callback est ici une fonction utilisateur, appelée sans paramètre.

c) Le callback appelle ici la fonction spécifiée en lui passant des paramètres arg1, arg2....

Noter que les accolades définissent ici bien un tableau cellulaire ! Ex: voir ci-dessous l'appel à la fonction trigo

Notez que dans certaines fonctions ui... la propriété peut être dénommée 'clickedcallback', 'oncallback' ou 'offcallback'. Écriture d'une fonction de callback :

function fonction(hsrc, event {, arg1, arg2 ...})

code de la fonction ...

end

La fonction de callback doit spécifier au minimum les 2 premiers paramètres d'entrée hsrc et event :

hsrc (obligatoire) : c'est le handle du contrôle graphique qui est à la source du callback ;

à partir de celui-ci, on peut récupérer toutes les valeurs correspondant aux propriétés du contrôle graphique

event (obligatoire) : retourne des informations spécifiques sur l'événement qui a déclenché le callback

arg1, arg2 ... (facultatifs) : on récupère ici les éventuelles données passées en paramètre à l'invocation du callback

9/14/2018

MATLAB et Octave - 8. Interfaces-utilisateur graphiques (GUI)

https://enacit1.epfl.ch/cours_matlab/gui.shtml

5/11

le premier champ on peut introduire un angle en degrés, puis à l'aide du menu on choisit une fonction trigonométrique qui affiche, dans le second champ, le sinus ou le cosinus de l'angle. On peut quitter l'application avec le bouton Quitter ou avec le menu Fichier > Quitter.

function exemple_callback

dlg = figure('name','Exemple de callbacks', 'position',[200 500 320 100], 'menubar','none', 'numbertitle','off'); m1 = uimenu(dlg, 'label','&Fichier', 'accelerator','f'); % menu avec raccourci alt-f

uimenu(m1, 'label','Quitter', 'accelerator', 'q', 'callback','close'); % article avec raccourci ctrl-q champ1 = uicontrol(dlg, 'style','edit', 'string','0', 'position',[30 60 50 25]);

champ2 = uicontrol(dlg, 'style','edit', 'position',[200 60 90 25]);

uicontrol(dlg, 'style','popupmenu', 'string',{'sin','cos'}, 'position',[100 60 50 25], ... 'callback', {@trigo, champ1, champ2});

uicontrol(dlg, 'style','pushbutton', 'string','Quitter', 'position',[120 10 80 25], 'callback','close'); end

function trigo(h,e, ch1, ch2)

angle = deg2rad(str2num(get(ch1,'string'))); % récupère angle (degrés) dans 1er champ et conversion (radians) menu = get(h,'string'); % récupère articles du menu popup {'sin', 'cos'}

fct = menu{get(h,'value')}; % récupère l'article sélectionné switch fct case 'sin' res = sin(angle); case 'cos' res = cos(angle); end

set(ch2,'string', num2str(res)) % affiche le sinus ou cosinus de l'angle dans 2e champ end

8.3.2 Éléments d'interface graphique (UI Controls)

Menus

Fonction et description

Exemple Illustration

hm = uimenu({dlg,} 'label','texte' {, 'accelerator','car'} {, 'property',value ...} );

Ajoute, dans la fenêtre dlg (ou la fenêtre courante si dlg n'est pas spécifié), le menu avec le libellé texte indiqué. On pourra déplier ce menu avec la souris ou le raccourci clavier alt-car.

Inséré à l'intérieur du texte du menu, le caractère & désigne à sa droite le caractère qui sera souligné lorsque l'on frappe alt. Cela permet de mettre en évidence les raccourcis des entrées principales des menus.

uimenu(hm, 'label','article' {, 'accelerator','car'} , 'callback',callback {, 'property',value ...} )

Ajoute l'article de menu spécifié dans le menu hm. Le choix de cet article par l'utilisateur ou l'usage du raccourci clavier ctrl-car activera le

callback.

Parmi les propriétés intéressantes, mentionnons :

'enable','off|on' : désactive (grise) ou réactive l'article de menu

'separator','on|off' : ajoute ou enlève une ligne de séparation au-dessus de l'article

'checked','on|off' : ajoute ou enlève le caractère "vu" à gauche de l'article

Ex Menu utilisateur (illustré ci-contre avec Octave sous Ubuntu/Unity) m1 = uimenu('label','&Fichier', 'accelerator','f'); % => alt-f uimenu(m1, 'label','Quitter', 'accelerator','q', ...

'callback','close'); % => ctrl-q

Dans la première figure, notez bien le "F" qui apparaît en souligné. Et dans la seconde figure, la mention du raccourci "Ctrl-Q".

alt affiche :

alt-f affiche :

a) hcm = uicontextmenu({dlg,});

b) uimenu(hcm, 'label','article1', 'callback',callback1)

uimenu(hcm, 'label','article2', 'callback',callback2)

c) set(dlg, 'uicontextmenu', hcm);

a) et c) Met en place un menu contextuel dans la fenêtre dlg (ou la fenêtre courante), c'est-à-dire le menu apparaissant avec clic-droite

b) Ajoute l'article spécifié dans ce menu. Le choix de celui-ci par l'utilisateur activera le callback.

Ex Menu contextuel (illustré ci-contre avec Octave sous Ubuntu/Unity) Ce menu contextuel change la colormap de la fenêtre de figure : dlg = dialog('name','Titre', 'windowstyle','normal'); cm = uicontextmenu(dlg);

uimenu(cm, 'label','Hot', 'callback','colormap(hot)') uimenu(cm, 'label','Winter', 'callback','colormap(winter)') set(dlg, 'uicontextmenu',cm);

clic-droite affiche :

Dans le document Cours MATLAB et GNU Octave en pdf (Page 126-128)