• Aucun résultat trouvé

9/14/2018 MATLAB et Octave 8 Interfaces-utilisateur graphiques (GUI)

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

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

1/11

8. Interfaces-utilisateur graphiques (GUI)

Ce chapitre est dédié à ma chère Danièle ♥ 28.4.2016 ☆

MATLAB ainsi qu'Octave GUI (pour ce dernier depuis la version 4) offrent la possibilité de programmer avec beaucoup de facilité, au-dessus des applications que l'on développe, de véritables interfaces-utilisateur graphiques (GUI, Graphical User Interface). Nous présentons dans ce chapitre :

l'usage des fenêtres de dialogue de sélection de fichiers et répertoires

l'usage des fenêtres de dialogue standards d'information, question oui/non, saisie de texte, sélection dans une liste, menu... la programmation complète d'une interface graphique spécifique

8.1 Fenêtres de dialogue de sélection de fichiers et répertoires

[file_name, path] = uigetfile('filtre' {,'titre_dialogue'} )

Fait apparaître à l'écran une fenêtre graphique de dialogue standard de désignation de fichier (selon figures ci-dessous). Fonction utilisée pour désigner un fichier à ouvrir en lecture, en suite de laquelle on utilise en principe la fonction fopen... Une fois le fichier désigné par l'utilisateur (validé par bouton Ouvrir ou

OK ), le nom du fichier est retourné sur la variable file_name, et le chemin d'accès complet de son dossier sur la variable path. Si l'utilisateur referme cette fenêtre avec le bouton Annuler ou Cancel , cette fonction retourne file_name = path = 0

• La chaîne titre_dialogue s'inscrit dans la barre de titre de cette fenêtre

• Le filtre permet de spécifier le type des fichiers apparaissant dans cette fenêtre. Par exemple *.dat ne présentera que les fichiers ayant l'extension

.dat (à moins que l'utilisateur ne choisisse All files (*.*) dans le menu déroulant Fichiers de type:)

Ex: le code ci-dessous fait désigner par l'utilisateur un fichier, puis affiche son contenu

(pour les fonctions fopen, feof, fgetl, fprintf et fclose, voir le chapitre "Entrées-sorties formatées") [fichier, chemin] = uigetfile('*.dat','Choisir le fichier à ouvrir :');

if ~fichier

error('Aucun fichier n''a été désigné !') end

fid = fopen([chemin fichier], 'rt'); % entre crochets, concaténation du chemin et du nom de fichier while ~ feof(fid)

ligne = fgetl(fid); disp(ligne) end

status=fclose(fid);

Fenêtre uigetfile sous Windows 7 Fenêtre uigetfile sous Ubuntu/Unity

(remarquez la case à cocher "Preview" et la zone correspondante)

[file_name, path] = uiputfile('fname' {,'titre_dialogue'} )

Fait apparaître une fenêtre de dialogue standard de sauvegade de fichier (en suite de laquelle on fait en principe un fopen...). Le nom de fichier fname

sera pré-inscrit dans la zone "Nom de fichier" de cette fenêtre. De façon analogue à la fonction uigetfile, le nom de fichier défini par l'utilisateur sera retourné sur la variable file_name, et le chemin complet d'accès au dossier sélectionné sur la variable path. Si un fichier de même nom existe déjà, MATLAB/Octave demandera une confirmation d'écrasement.

Ex: [fichier, chemin] = uiputfile('resultats.dat','Sauver sous :');

path = uigetdir( {'path_initial' {,'titre_dialogue' } } )

Fait apparaître à l'écran une fenêtre graphique de dialogue standard de sélectionnement de répertoire, et retourne le chemin de celui-ci sur path • Le path_initial permet de positionner la recherche à partir du path ainsi spécifié. Si ce paramètre est omis, le positionnement initial s'effectue sur le répertoire courant

• La chaîne titre_dialogue s'inscrit dans la barre de titre de cette fenêtre

8.2 Fenêtres de dialogue standards

Les fonctions présentées ici permettent d'afficher des fenêtres de dialogues standards. Sauf mention du contraire, elles sont "modale", c'est-à-dire que le programme est suspendu tant que l'utilisateur n'a pas répondu à la sollicitation de la fenêtre.

Nous les présentons sous forme d'exemples, et les illustrations proviennent ici de Octave sous Windows 7.

Fenêtre d'information :

msg={'Message d''information', 'sur plusieurs lignes'}; msgbox(msg, 'Titre fenetre', 'none');

Le premier paramètre msg peut être une chaîne simple (qui sous Octave peut contenir \n pour générer un saut à la ligne) ou un vecteur cellulaire de chaînes (chaque élément étant alors affiché dans la fenêtre sur une nouvelle ligne).

Le 3e paramètre peut être 'warn', 'help' ou 'error' (=> affichage d'une icône dans la fenêtre), ou être ignoré ou valoir 'none' (=> pas d'icône).

Remarque : notez la différence de comportement entre MATLAB et Octave :

Sous Octave, l'affichage de cette fenêtre suspend le programme qui redémarre une fois qu'on a cliqué OK

Cette fenêtre ne suspend pas l'exécution du programme (pour cela il faudrait faire

Fenêtre d'avertissement :

msg={'Message d''avertissement', 'sur plusieurs lignes'}; warndlg(msg, 'Titre fenetre');

Cette fonction fournit le même résultat que msgbox(msg, titre, 'warn')

Remarque : cette fonction suspend l'exécution du programme sous Octave 3.8, mais pas sous MATLAB (idem que pour msgbox)

Fenêtre d'aide :

msg={'Message d''aide', 'sur plusieurs lignes'}; helpdlg(msg, 'Titre fenetre');

Cette fonction fournit le même résultat que msgbox(msg, titre, 'help')

Remarque : cette fonction suspend l'exécution du programme sous Octave 3.8, mais pas sous MATLAB (idem que pour msgbox)

Fenêtre d'erreur :

msg={'Message d''erreur', 'sur plusieurs lignes'}; errordlg(msg, 'Titre fenetre');

Cette fonction fournit le même résultat que msgbox(msg, titre, 'error')

Remarque : cette fonction suspend l'exécution du programme sous Octave 3.8, mais pas sous MATLAB (idem que pour msgbox)

Fenêtre de question oui/non :

Cette fonction suspend l'exécution du programme et affiche une fenêtre de question. L'exécution se poursuit lorsque l'on a cliqué sur l'un des 3 boutons.

msg={'Question sur', 'plusieurs lignes'};

bouton = questdlg(msg, 'Titre fenetre','Yes')

Avec la première forme ci-dessus, affiche en-dessous du message msg les 3 boutons Cancel , No et Yes . Le 3e paramètres (facultatif, 'Yes' dans l'exemple ci-dessus) indique quel bouton est pré- sélectionné et sera activé si l'on presse enter. Retourne sur bouton la chaîne de caractère correspondant au nom du bouton pressé.

Différence de comportement entre MATLAB et Octave si on utilise la case de fermeture de la fenêtre au lieu des boutons : MATLAB retourne une chaîne vide, Octave retourne 'Cancel'

bouton = questdlg(msg, 'Titre fenetre', ...

'Annuler', 'Non', 'Oui', 'Annuler')

Avec la seconde forme ci-dessus, on spécifie le nom des boutons. Il peut y en avoir 2 ou 3 (ici 3), et on doit obligatoirement indiquer une chaîne supplémentaire spécifiant le nom du bouton activé par défaut si l'on presse enter.

Fenêtre de saisie de champs de texte :

Cette fonction suspend l'exécution du programme et affiche une fenêtre de saisie multi-champs. L'exécution se poursuit lorsque l'on a cliqué sur l'un des 2 boutons.

labels = {'Prenom', 'Nom', 'Pays', 'Commentaire'}; li_cols = [1, 15; 1, 15; 1, 12; 2, 20];

val_def = {'', '', 'Suisse', ''};

vec_cel = inputdlg(labels, 'Titre fenetre', li_cols, val_def)

Affiche les champs de saisie étiquetés par les chaînes du vecteur cellulaire labels.

Le paramètre li_cols (facultatif, mais nécessaire si on veut passer le paramètre val_def) permet de définir la taille des champs :

• scalaire : nombre de lignes de tous les champs

vecteur à 2 éléments [lignes, colonnes] : nombre de lignes et de colonnes de tous les champs • vecteur (avec autant d'éléments que labels) : nombre de lignes de chaque champ

• matrice (de 2 colonnes et autant de lignes que d'éléments dans labels) : nombre de lignes et de colonnes de chaque champ

Notez que sous MATLAB le paramètre colonnes affecte non seulement la largeur du champ mais aussi la largeur d'affichage des étiquettes labels !

Le vecteur cellulaire de chaînes val_def (paramètre facultatif) permet de pré-remplir les champs par des valeurs par défaut (ici le Pays Suisse).

Lorsque l'on clique Ok, la fonction retourne les données saisies dans les différents champs sur un vecteur cellulaire de chaînes vec_cel.

Fenêtre de sélection dans une liste :

Cette fonction suspend l'exécution du programme et affiche une fenêtre de sélection. L'exécution se poursuit lorsque l'on a cliqué sur l'un des 2 boutons inférieurs.

valeurs={'pommes','poires','cerises','kiwis','oranges'};

[sel_ind, ok] = listdlg('ListString', valeurs, ... 'Name', 'Vos fruits', ...

'PromptString', 'Fruits preferes :', ... 'SelectionMode', 'Multiple', ... 'ListSize', [100 140], ... 'InitialValue', [1, 3], ... 'OKString', 'J''ai choisi', ... 'CancelString', 'Annuler'); if ok

fprintf('Fruits choisis: ') for ind = 1:numel(sel_ind)

fprintf([valeurs{sel_ind(ind)} ' ']) end

9/14/2018

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

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

3/11

fprintf('\n') end

Les paramètres d'entrée de listdlg sont définis par paire : 'mot-clé', valeur

Paramètre d'entrée obligatoire :

'ListString' réfère le vecteur cellulaire valeurs des éléments à afficher dans la liste Paramètres d'entrée facultatifs :

'Name' définit le titre de la fenêtre

'PromptString' définit l'invite affichés au haut de la liste

'SelectionMode' peut être 'Multiple' (sélection possible de plusieurs valeurs avec ctrl-clic, mode par défaut) ou 'Single'

'ListSize' définit en pixels la taille [dx dy] de la zone d'affichage des valeurs

'InitialValue' réfère un vecteur contenant les indices dans valeurs des éléments qui seront présélectionnés ;

en l'absence de ce paramètre ou si on spécifie [] : sous Octave : aucun élément n'est présélectionné

sous MATLAB : le premier élément est présélectionné ( un bug dans le cas où l'on définit explicitement [])

'OKString' permet de redéfinir le texte du bouton Ok • 'CancelString' permet de redéfinir le texte du bouton Cancel Paramètres de sortie :

sel_ind est un vecteur ligne contenant les indices des éléments de valeurs que l'on a sélectionnés ok retourne 1 si on a cliqué Ok , et 0 si on a cliqué Cancel

Menu de choix :

choix = menu('Titre', 'element1','element2',...) ou

v_cel = {'element1','element2',...} puis choix = menu('Titre', v_cel)

Implémente un menu retournant dans choix le numéro d'ordre de l'élément sélectionné : MATLAB : ce menu apparaît sous forme d'une fenêtre dans laquelle chaque élement fait l'objet d'un bouton (voir figure de gauche ci-contre). Il suffit de cliquer sur un bouton pour refermer la fenêtre et continuer l'exécution du programme.

Octave : Sous Octave ≥ 4.0, ce menu est implémenté par une fenêtre analogue à celle de la fonction listdlg (voir figure de droite ci-contre). Le bouton Select All est désactivé. Il faut sélectionner l'élément désiré puis cliquer sur Ok pour refermer la fenêtre et continuer l'exécution du programme.

Si vous souhaitez implémenter un choix permettant de sélectionner plusieurs éléments, utilisez la fonction listdlg présentée plus haut.

Barre de progression :

handle = waitbar(fraction {,'texte'} )

Affiche une barre de progression ("thermomètre") de longueur définie par le paramètre fraction dont la valeur doit être comprise entre 0.0 (barre vide) et 1.0 (barre pleine). On utilise par exemple cette fonction pour faire patienter l'utilisateur en lui indiquant la progression d'un traitement d'une certaine durée.

Cette barre se présente sous la forme d'une fenêtre graphique que l'on pourra refermer avec

close(handle). Attention, seul le 1er appel à waitbar peut contenir le paramètre texte (qui s'affichera au-dessus de la barre), sinon autant de fenêtre seront crées que d'appels à cette fonction ! barre = waitbar(0,'Patientez...');

for k=1:50 pause(0.1)

% pour les besoins de l'exemple, on % fait ici une pause en lieu et % place d'autres instructions... waitbar(k/50)

end

close(barre)

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