FAQ MATLAB
FAQ MATLABConsultez toutes les FAQ
Nombre d'auteurs : 11, nombre de questions : 172, dernière mise à jour : 29 septembre 2022
- Qu'est-ce qu'un handle ?
- Qu'est-ce qu'une fonction callback ?
- Comment utiliser une fonction callback ?
- Comment gérer les arguments d'entrée et de sortie d'une interface créée avec GUIDE ?
- Pourquoi j'obtiens une erreur lorsque mon premier argument est une chaine de caractères ?
- Comment écrire du texte avec fond transparent sur une image en arrière-plan ?
- Comment rendre la sélection de plusieurs radiobutton exclusive ?
- Est-il possible de rendre les objets Uicontrol transparents ?
- Comment positionner simplement une interface graphique ?
- Comment obtenir une interface graphique qui s'ouvre en plein écran ?
- Comment gérer efficacement les variables et les identifiants des objets graphiques ?
- Comment modifier la police de caractères utilisée sur les objets graphiques ?
- Comment modifier l'icône qui apparait en haut à gauche d'un objet Figure ?
- Comment gérer la taille d'une fenêtre sur des machines de résolutions différentes ?
- Comment afficher un tableau ?
- Comment saisir une entrée sur plusieurs lignes dans un objet Uicontrol Edit ?
- Comment permettre la sélection de plusieurs lignes dans un objet Uicontrol Listbox ?
- Comment mettre une image en arrière-plan ?
- Comment créer des onglets ?
- Quels sont les moyens d'interaction avec l'utilisateur ?
- Comment récupérer l'élément sélectionné d'un objet Uicontrol Popupmenu ?
Le handle est un identifiant qui permet de désigner un objet de manière unique. Il se présente sous la forme d'une valeur numérique.
Il permet l'accès à ses propriétés en lecture et écriture avec les fonctions getDocumentation de la fonction get et setDocumentation de la fonction set :
valeur = get(handleObjet,'propriété'
);
set(handleObjet, 'propriété'
, nouvelle_valeur)
Les syntaxes du genre :
valeur = handleObjet.propriete;
handleObjet.propriete = nouvelle_valeur;
sont à proscrire. On utilise exclusivement les fonctions get et set.
Il peut être obtenu de diverses façons :
-
Avec les fonctions de MATLAB
Sélectionnezgca
% handle de l'objet Axes courant
gcf% handle de l'objet Figure courant
gcbf% handle de l'objet Figure où se trouve l'objet graphique dont le callback est en cours d'exécution
gcbo% handle de l'objet graphique dont le callback est en cours d'exécution
gco% handle de l'objet graphique courant
-
Avec la fonction qui crée l'objet
SélectionnezhandleFigure = figure;
% Pour un objet Figure
handleEdit = uicontrol('Style'
,'Edit'
)% Pour un objet Uicontrol Edit
handleAxes = axes% Pour un objet Axes
handleImage = image(im)% Pour un objet Image
handleLine = plot(x,y,'r'
)% Pour un objet Line
% …
-
Avec la fonction guihandlesDocumentation de la fonction guihandles qui retourne dans une structure le handle de tous les objets enfants d'un objet Figure ayant leur propriété
'Tag'
définie (pour les utilisateurs de GUIDE, c'est cette fonction qui est appelée implicitement au début pour créer la superstructure handles) :SélectionnezhandleFigure = figure(...
'menubar'
,'none'
,...'Tag'
,'myFigure'
); handleUipanel = uipanel(handleFigure,...'Tag'
,'myUipanel'
); axes('Parent'
, handleUipanel,...'Tag'
,'myAxes'
); >> guihandles(handleFigure) ans = myFigure: 1 myUipanel: 0.0046 myAxes: 1.0042 -
Avec les fonctions findobjDocumentation de la fonction findobj / findallDocumentation de la fonction findall : on renseigne le parent et/ou les valeurs des propriétés des objets que l'on cherche. La propriété
'Tag'
peut se révéler très utile dans ce cas d'utilisation.Sélectionnezfindall(handleParent,
'propriété_1'
,'Valeur_1'
, …) findobj(handleParent,'propriété_1'
,'Valeur_1'
, …)- findobj ne retourne que les objets dont la propriété
'HandleVisibility'
est à'on'
(même si on effectue une recherche selon ce critère), mais possède une large possibilité de syntaxes (regexp, opérations logiques, profondeur). - findall retourne tous les objets recherchés indifféremment de la valeur prise par leur propriété
'HandleVisibility'
.
- findobj ne retourne que les objets dont la propriété
On pourra vérifier la validité du handle (objet non encore détruit par exemple) à l'aide de la fonction ishandleDocumentation de la fonction ishandle.
Une fonction callback est une fonction que l'on associe à un composant d'une interface graphique (objet Figure, objet Uicontrol Text, Edit, Lisbox…). Elle définit la réponse à une action de l'utilisateur sur ce composant (clic sur un bouton, appui sur une touche du clavier, sélection d'un élément de menu…).
Cette association se fait par le biais de certaines propriétés des objets décrites dans le tableau suivant :
La fonction callback devra se présenter sous la forme suivante avec deux entrées :
-
Sans GUIDE :
Sélectionnezfunction
nomFonction(hObject, eventData) -
Avec GUIDE :
Sélectionnezfunction
tagObjet_nomCallback(hObject, eventData, handles)
Où
- hObject sera le handle de l'objet qui aura subi l'évènement ;
-
eventData un argument soit vide (=[]), soit une structure possédant des informations propres à l'évènement survenu, ayant les champs suivants :
Propriétés Champs Description KeyPressFcn
KeyReleaseFcn
WindowKeyPressFcn
WindowKeyReleaseFcnCharacter Caractère interprété suite à l'appui de la/des touche(s). Key Nom de la touche pressée. Modifier Nom du modificateur ( 'shift'
,'control'
,'alt'
,'command'
, [] sinon).WindowScrollWheelFcn VerticalScrollCount Nombre de crans passés de la molette. VerticalScrollAmount Nombre de lignes par cran fixé par le système. SelectionChangeFcn EventName Simple chaîne 'SelectionChanged'
.OldValue Handle de l'objet précédemment sélectionné. NewValue Handle de l'objet nouvellement sélectionné. CellEditCallback Indices Indices [i,j] de la cellule éditée. PreviousData Donnée de la cellule avant édition. EditData Nouvelle donnée rentrée. NewData Nouvelle valeur interprétée effectivement affichée Error Erreur intervenue pendant l'interprétation CellSelectionCallback Indices Indices [i,j] de la/des cellule(s) sélectionnée(s). - handles une structure ayant pour champs les différents tags des objets de l'interface contenant leur handle respectif.
Attention : une fonction callback ne renvoie jamais de valeur.
Après avoir pris connaissance de la propriété à utiliser selon le tableau présenté dans Qu'est-ce qu'une fonction callback ?, on pourra assigner le comportement sous trois formes :
-
Une chaîne de caractères
Cette méthode ne conviendra que pour des codes très simples. L'expression contenue dans cette chaîne pourra contenir une simple ligne de code ou l'appel à une fonction.Sélectionnezuicontrol(...
'Style'
,'pushbutton'
,...'String'
,'Hello'
,...'Callback'
,'disp(''Hello World'')'
);Méthode toutefois déconseillée, et ce pour plusieurs raisons :
-
Le code est peu lisible (doublement des guillemets simples « ' », obligation d'ajouter des « ; » et « , » pour séparer les instructions), et impossible à déboguer.
-
L'expression est évaluée dans le workspace de base. Autrement dit, les variables définies dans la fonction de l'interface ne sont pas accessibles directement, et inversement pour les éventuelles variables créées dans l'expression.
-
Les autres sous-fonctions situées dans le même fichier m ne seront pas visibles, et donc inutilisables.
-
Une fonction utilisée seulement à cet emplacement peut ne pas être incluse automatiquement dans les dépendances lors du déploiement d'une application avec le MATLAB Compiler.
Il faudra alors soit ajouter la ligneSélectionnez% #function nomFonction
soit ajouter la fonction avec l'option -a lors de la compilation avec la fonction mccDocumentation de la fonction mcc :
Sélectionnezmcc
-m application -a nom_fonction
-
-
Un handle de fonction
On fera passer le handle d'une fonction callback (voir Qu'est-ce qu'une fonction callback ?) à l'aide du symbole @ (voir Que représente le symbole @ ?).Exemple : action de confirmation suite à la fermeture de la fenêtre
Sélectionnezfigure(
'CloseRequestFcn'
,@my_closereq)% Ou :
handleFigure = figure; set(handleFigure,'CloseRequestFcn'
, @my_closereq)Avec
Sélectionnezfunction
my_closereq(hObject ,eventData) selection = questdlg('Voulez-vous vraiment fermer cette fenêtre ?'
,...'Confirmation'
,...'Oui'
,'Non'
,'Oui'
);if
strcmp(selection ,'Oui'
) delete(hObject)end
end
-
Un tableau de cellules
Cette méthode permet de faire facilement passer des arguments supplémentaires. Dans la première cellule, on retrouve le handle ou le nom de la fonction callback, et dans les suivantes les arguments supplémentaires.Exemple : initialiser lors de sa création un objet Uicontrol Pop-up menu avec ses éléments et celui sélectionné :
Sélectionnezitems = {
'item1'
;'item2'
;'item3'
}; index_initial = 2; uicontrol(...'Style'
,'popupmenu'
,...'CreateFcn'
, {@my_create, items, index_initial})% Ou :
uicontrol(...'Style'
,'popupmenu'
,...'CreateFcn'
, {'my_create'
, items, index_initial})% Ou encore avec la méthode précédente :
uicontrol(...'Style'
,'popupmenu'
,...'CreateFcn'
, @(hObject, eventdata) my_create(hObject, eventdata, items, select) )Avec
Sélectionnezfunction
my_create(hObject, eventData, items, index) set(hObject,...'String'
, items,...'Value'
, index)Les changements effectués par la suite sur les variables passées en paramètre ne seront pas répercutés lors des appels à la fonction callback, ce seront les valeurs au moment de l'affectation du callback qui seront prises en compte.
Sous GUIDE, cette affectation se fait par le « Property Inspector » de l'objet en appuyant sur le bouton en face de la propriété correspondante qui va automatiquement créer la fonction dans le fichier .m rattaché.
Récupérer les arguments d'entrée passés à l'interface
-
Ceci, contrairement à ce que l'on pourrait penser, ne se fait pas dans la fonction principale, mais au sein de la sous-fonction nommée nom_interface_OpeningFcn, automatiquement définie par GUIDE ainsi (nom_interface étant le nom que vous avez fixé) :
Sélectionnezfunction
nom_interface_OpeningFcn(hObject, eventdata, handles, varargin)Cette fonction prend les paramètres :
- hObject : le handle de l'objet Figure de l'interface ;
- eventdata : argument vide (=[]) ne servant actuellement pas ;
- handles : la structure contenant les handles de tous les objets ayant leur propriété
'Tag'
définie, constituant l'interface ; - varargin : un tableau de cellules qui contient les entrées passées à la fonction principale.
C'est donc ce dernier paramètre varargin qui nous intéresse. Pour un appel de la forme :
Sélectionneznom_interface(entree1, entree2, …)
Vous pourrez récupérer les entrées comme ceci (notez l'utilisation d'accolades) :
Sélectionnezfunction
nom_interface_OpeningFcn(hObject, eventdata, handles, varargin) entree1 = varargin{1}; entree2 = varargin{2}; …N'oubliez pas de sauvegarder la structure handles dès que vous la modifiez (si vous y stockez, par exemple, ces paramètres ou toute autre variable qui a été obtenue à partir de ces éléments afin de les rendre disponibles dans les autres fonctions de l'interface) à l'aide de la fonction guidataDocumentation de la fonction guidata :
Sélectionnezhandles.nom = valeur; … guidata(hObject, handles)
Ressortir les arguments de l'interface
-
Il y a symétriquement la sous-fonction nommée nom_interface_OutputFcn pour effectuer cela. Elle se présente comme ceci :
Sélectionnezfunction
varargout = nom_interface_OutputFcn(hObject, eventdata, handles)Avec :
- hObject : le handle de l'objet Figure de l'interface ;
- eventdata : argument vide (=[]) ne servant actuellement pas ;
- handles : la structure contenant les handles de tous les objets constituant l'interface ayant leur propriété
'Tag'
définie, auxquels s'ajoutent les éventuels champs que vous avez ajoutés ; - varargout : tableau de cellules, qui contiendra tous les arguments de sortie.
Ce dernier paramètre permettra donc de faire sortir les paramètres en utilisant la syntaxe qui suit (notez l'utilisation d'accolades) :
Sélectionnezfunction
varargout = nom_interface_OutputFcn(hObject, eventdata, handles) varargout{1} = sortie1; varargout{2} = sortie2; …La fonction de l'interface sera alors appelée comme toute autre fonction sous la forme :
Sélectionnez[sortie1, sortie2, …] = nom_interface(entree1, entree2, …);
À noter que par défaut, la fonction nom_interface_OutputFcn est exécutée de suite, et les arguments directement retournés depuis l'appel à la fonction principale.
Pour éviter cela, il faut décommenter la ligne uiwaitDocumentation de la fonction uiwait située dans la fonction nom_interface_OpeningFcn qui permettra d'attendre jusqu'à un appel à uiresumeDocumentation de la fonction uiresume effectué suite à une action de fermeture de l'interface, typiquement :- un appui sur la croix rouge de la fenêtre : dans la fonction callback CloseRequestFcn de l'objet Figure où l'on pourra éventuellement demander la confirmation de fermeture de l'interface avant d'effectivement faire appel à la fonction uiresume (un exemple dans le 2. de ce sujetComment utiliser une fonction callback ?) ;
- un appui sur un bouton « OK » de validation : dans sa fonction callback associée, où l'on pourra vérifier les paramètres saisis avant d'effectivement faire appel à la fonction uiresume et afficher un message le cas échéant.
Ensuite les arguments seront retournés.
Lien : Qu'est-ce que nargin/nargout - varargin/varargout ?
Lien : Qu'est-ce qu'un handle ?
Lien : Qu'est ce qu'un tableau de cellules ?
La particularité de l'outil GUIDE de MATLAB est qu'il appelle ses fonctions callback de la manière suivante (nom_interface étant le nom que vous avez fixé) :
nom_interface('nom_fonction_callback'
, autres paramètres…);
appelant ainsi la fonction principale, comme vous l'appelleriez communément pour l'utiliser. Afin de traiter ces appels spéciaux, les lignes suivantes (insérées automatiquement au début de chaque fichier .m créé par GUIDE) se chargent de vérifier si le premier paramètre est une chaine de caractères, et le cas échant de « tenter » de la convertir en handle de fonction avec str2funcDocumentation de la fonction str2func.
% NOM_INTERFACE('CALLBACK',hObject,eventData,handles,...) calls the local
% function named CALLBACK in NOM_INTERFACE.M with the given input arguments.
[...]
if
nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
Mais si dans votre utilisation vous passez n'importe quelle chaine de caractères cette conversion échouera inévitablement, vous donnant le message suivant :
Warning: The input to STR2FUNC "<votre chaîne>" is not a valid function name. This will generate an error in a future release.
Afin de contourner cela, une astuce toute simple consistera à passer votre chaine au sein d'un tableau de cellules.
% au lieu de :
nom_interface('ma chaine'
, autres paramètres…);
% nous aurons :
nom_interface({'ma chaine'
}, autres paramètres…);
(La condition ischar(varargin{1}) = ischar({'ma chaine'
}) retournant alors false, contrairement à ischar('ma chaine'
) = true)
La récupération de cette chaine dans la fonction nom_interface_OpeningFcn se fera alors comme ceci (notez l'utilisation d'accolades) :
function
nom_interface_OpeningFcn(hObject, eventdata, handles, varargin)
ma_chaine = varargin{1}{1};
Lien : Comment gérer les arguments d'entrée et de sortie d'une interface créée avec GUIDE ?
Lien : Qu'est-ce que nargin/nargout - varargin/varargout ?
Nous avons vu précédemment comment mettre une image en arrière-plan dans une interface, ainsi que l'impossibilité de rendre les objets Uicontrol Text transparents.
L'astuce consiste à utiliser la fonction textDocumentation de la fonction text qui crée un objet Text ayant par défaut sa propriété BackgroundColorPropriété BackgroundColor de l'objet Text à 'none'
(transparent) :
handleAxes % du sujet « Comment mettre une image en arrière-plan ? »
handleText = text(0.5, 0.5,...
'Sans le fond,'
,...
'Parent'
, handleAxes,...
'Color'
, 'white'
,...
'FontSize'
, 12,...
'FontWeight'
, 'bold'
,...
'Units'
, 'normalized'
,...
'HorizontAlalignment'
, 'center'
,...
'VerticalAlignment'
, 'middle'
);
uistack(handleText, 'top'
);
Pour rendre exclusive la sélection de plusieurs objets Uicontrol RadioButton, il existe trois solutions.
1) Dans le cas d'une interface programmée à la main, ajouter à la fontion callback rattachée à la propriété Callback de chacun des objets Uicontrol RadioButton, les lignes suivantes :
h = findobj(gcbf, 'style'
, 'radio'
);
set(h, 'value'
, 0);
set(gcbo, 'value'
, 1);
2) Dans le cas d'une interface programmée avec le GUIDE, la fontion callback rattachée à la propriété Callback de chacun des objets RadioButton doit ressembler à ceci :
function
<Tag de l'objet RadioButton>_Callback(hObject, eventdata, handles)
% hObject handle to <Tag de l'objet RadioButton> (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
if
(get(hObject,'Value'
) == get(hObject,'Max'
))
% Radio button is selected-take approriate action
h = findobj(gcbf, 'style'
, 'radio'
);
set(h, 'value'
, 0);
set(hObject, 'value'
, 1);
else
% Radio button is not selected-take approriate action
end
% Hint: get(hObject, 'Value') returns toggle state of <Tag de l'objet RadioButton>
3) La dernière solution (conseillée) consiste à intégrer les objets RadioButton dans un objet UiButtonGroup comme ceci :
p = uibuttongroup('position'
,[.1 .1 .5 .5]);
uicontrol('style'
, 'radio'
, 'parent'
, p, 'position'
, [10 50 50 20])
uicontrol('style'
, 'radio'
, 'parent'
, p, 'position'
, [10 10 50 20])
Non. Les objets de type Uicontrol (Pushbutton, EditText, Slider, ListBox…) ne possèdent pas de propriété permettant de les rendre transparents.
Les interfaces graphiques se positionnent aisément à l'aide de la fonction moveguiDocumentation de la fonction movegui.
Par exemple, pour placer l'interface graphique au centre de l'écran :
movegui('center'
);
Il n'existe pas de fonction dans MATLAB permettant d'ouvrir une interface graphique en plein écran.
Une solution simple consiste à faire :
fig = figure;
set(fig, 'Units'
, 'Normalized'
, 'Position'
, [0 0 1 1]);
Malheureusement, ceci n'assure pas toujours que la figure obtenue sera plein écran (conflit avec la Barre des Tâches de Windows par exemple).
Une autre possibilité est d'utiliser la propriété OuterPosition plutôt que Position. Suivant le système d'exploitation elle semble donner de meilleurs résultats.
Plusieurs contributions existent néanmoins sur le File Exchange (faire une recherche avec « figure maximize »), parmi lesquelles on peut trouver la fonction multiplateforme maximize.
Voir aussi cette solution : Is it possible to maximize, minimize or get the state of my figure programmatically in MATLAB?
Il existe plusieurs méthodes permettant de programmer efficacement les interfaces graphiques.
Les quatres plus courantes sont :
- les variables globalesDocumentation mot clé global ;
- les fonctions setappdataDocumentation de la fonction setappdata, getappdataDocumentation de la fonction getappdata et findobjDocumentation de la fonction findobj ;
- les fonctions guidataDocumentation de la fonction guidata et guihandlesDocumentation de la fonction guihandles ;
- les fonctions imbriquées (nested functionsDocumentation nested functions).
Plus d'information en lisant l'article en lien de cette question.
Lien : Développement efficace des interfaces graphiques (GUI) sous MATLAB
Lien : Qu'est-ce qu'une fonction imbriquée (nested function) ?
La police du titre d'un objet Figure est celle définie par le système d'exploitation pour les fenêtres donc il n'est pas possible de la changer depuis MATLAB.
Par contre, pour tous les autres objets, il est possible de modifier la police de caractères en ajustant les propriétés FontAngle, FontName, FontSize, FontUnits, FontWeight.
Il peut être utile d'utiliser la police obtenue par la commande suivante :
fontName = get(0, 'FixedWidthFontName'
)
Cette police est celle, pour la plateforme en cours, telle que chaque lettre fait la même largeur.
Cela peut-être très utile par exemple pour créer des structures arborescentes, ou des tableaux dans des objets de type liste.
Cette action est interdite. En effet, l'icône en haut à gauche d'un objet Figure représente le logo MATLAB et sa modification entraine la rupture du contrat de licence MATLAB.
Lien : How can I control the appearance of the title bar and the title bar icon ?
Deux solutions peuvent être utilisées :
-
Utiliser l'unité normalized
Exemple :
Sélectionnezf = figure(
'Units'
,'normalized'
,'Position'
, [0.1 0.1 0.5 0.5]);Et mettre aussi tous les objets enfants de la fenêtre en unité normalized
Une possibilité pour cela est d'utiliser findobjDocumentation de la fonction findobj de la façon suivante :Sélectionnez% f étant le handle de la figure précédemment créée
% findobj recherche ici tous les objets dans la figure f qui ont la propriété Units.
set(findobj(f,'-property'
,'Units'
),'Units'
,'normalized'
); -
Utiliser les propriétés de l'écran que l'on récupère avec get(0) :
Exemple :
Sélectionnez% Mettre les unités de l'écran et de la figure en pixels pour être sûr qu'ils aient la même unité
unitsEcran = get(0,'Units'
); set(0,'Units'
,'pixels'
);% On récupère la taille de l'écran
posScreen = get(0,'ScreenSize'
);% On gère la position de la fenêtre
posFigure = [10 10 posScreen(3)/2 posScreen(4)/2];% On crée la figure avec les unités pixels
f = figure('Units'
,'pixels'
,'Position'
, posFigure);% On remet les unités initiales de l'écran
set(0,'Units'
, unitsEcran);
Cette solution n'est valable qu'à partir de MATLAB R2008a seulement.
L'affichage d'un tableau se fait à l'aide de la fonction uitableDocumentation de la fonction uitable comme ceci en fixant la propriété 'Data'
:
mesDonnees = rand(3);
uitable('Data'
, mesDonnees)
% ou après création avec set :
handleUitable = uitable(.);
set(handleUitable, 'Data'
, mesDonnees)
Les données peuvent être des valeurs ou des chaînes de caractères ou absentes, il faut dans ce dernier cas utiliser un tableau de cellules :
mesDonnees = {...
'Dupond'
, 'Fernand'
, [];
'Durant'
, 'Eric'
, 36};
columnName = {'Nom'
, 'Prenom'
, 'Age'
};
uitable('ColumnName'
, columnName,'Data'
, mesDonnees)
Les données ne pourront être introduites que toutes à la fois (éventuellement avec des données vides) et non case par case.
De nombreuses propriétés peuvent être rajoutées : la possibilité d'éditer les colonnes ou non (propriété ColumnEditablePropriété ColumnEditable de l'objet Uitable), l'utilisation de listes déroulantes et check box (propriété ColumnFormatPropriété ColumnFormat de l'objet Uitable). La lecture de la documentation MATLAB (uitableDocumentation de la fonction uitable + Uitable PropertiesListe des propriétés de l'objet Uitable) sera alors utile.
Note aux utilisateurs de MATLAB R2008a : la fonction uitable a été « officiellement » intégrée sous votre version de MATLAB. Néanmoins, sous MATLAB R2008a, cette fonction présente de nombreux bogues et imperfections (corrigés et/ou améliorés dans les versions suivantes).
Lien : Displaying Matrix Data in a GUI
Lien : Add Components to the GUI - Table
L'objet Uicontrol Edit n'admet par défaut qu'une seule ligne d'édition. Cette contrainte est imposée par les propriétés 'Min'
et 'Max'
(fixées par défaut à 0 et 1) :
- si Max - Min <= 1, alors l'objet n'aura qu'une seule ligne ;
- si Max - Min > 1, alors l'objet sera multiligne.
On fixera donc selon le comportement visé la bonne valeur de N (la propriété 'Min'
étant mise à 0 par défaut).
Sans GUIDE :
handleEdit = uicontrol(...
'Style'
,'edit'
,...
'Position'
,[100 100 200 50],...
'Max'
,N)
% Ou
set(handleEdit , 'Max'
, N)
Avec GUIDE : en fixant la valeur de la propriété 'Max'
dans le « Property Inspector » de l'objet ou par le code :
set(handles.TagEdit , 'Max'
, N)
avec TagEdit le champ rentré dans la propriété 'Tag'
.
Lien : How do I enter and evaluate multiple lines in a GUI edit box that I created in MATLAB?
Le principe est le même que pour rendre la saisie multiligne dans un objet Uicontrol Edit
- si Max - Min <= 1, un seul élément peut être sélectionné ;
- si Max - Min > 1, la sélection multiple est possible.
L'astuce consiste mettre l'image dans un objet AxesDocumentation de l'objet Axes positionné sur tout l'objet Figure (ou partie selon le besoin). Cet objet Axes doit être rendu invisible et mis en arrière-plan.
img = imread('peppers.png'
, 'png'
); % Charge l'image
handleAxes = axes('Units'
, 'Normalized'
, 'Position'
, [0 0 1 1]); % Crée un objet Axes prenant toute la fenêtre
% Vous pouvez bien sûr fixer vos dimensions selon votre besoin
imagesc(img, 'Parent'
, handleAxes) % Affiche l'image
uistack(handleAxes, 'bottom'
) % Place l'objet Axes en arrière-plan
set(handleAxes, 'Visible'
, 'off'
) % Cache les marques "ticks"
Il n'existe pour le moment aucune manière standard d'obtenir des onglets dans une interface.
On retiendra toutefois plusieurs façons de faire :
- utiliser les fonctions non-documentées de MATLAB uitab/uitabgroup ou tabdlg. On pourra consulter Tab panels - uitab and relatives ainsi que Uitab colors, icons and images et Uitab customizations ;
-
utiliser l'une des trois contributions suivantes du FEXFile Exchange :
Outre les objets UiPrésentation des objets graphiques - Les objets UI de base d'une interface, vous avez à votre disposition plusieurs boîtes de dialogue permettant de facilement communiquer avec l'utilisateur.
Sélection de fichiers / dossiers
- uigetfileDocumentation de la fonction uigetfile : permet à l'utilisateur de sélectionner un ou plusieurs fichiers dans un dossier de son choix. C'est la fenêtre typique que l'on a par le menu Fichier → Ouvrir. (Attention : cette fonction ne sert qu'à obtenir le chemin du ou des fichier(s) sélectionné(s), en aucun cas à les ouvrir ou à lire leur contenu. Toujours penser à récupérer le deuxième argument du chemin.) ;
- uiputfileDocumentation de la fonction uiputfile : permet à l'utilisateur de choisir le nom et dossier d'un fichier à sauvegarder. C'est la fenêtre typique que l'on a par le menu Fichier → Enregistrer. (De même que la précédente, cette fonction ne fait que retourner le chemin sous forme de chaîne de caractères, et l'argument du chemin est essentiel afin d'effectuer la sauvegarde dans le dossier choisi par l'utilisateur et non dans le répertoire courant.) ;
- uigetdirDocumentation de la fonction uigetdir : permet à l'utilisateur de sélectionner un dossier.
Pour ces trois fonctions, pensez à vérifier le cas d'une valeur de retour à 0 (if
isequal(FileName,0) …), correspondant un appui sur le bouton d'annulation ou la croix rouge, avant de continuer votre programme.
Messages
- warndlgDocumentation de la fonction warndlg, errordlgDocumentation de la fonction errordlg, helpdlgDocumentation de la fonction helpdlg : permettent d'afficher des messages avec des icônes (respectivement , et ) ;
- msgboxDocumentation de la fonction msgbox : permet d'afficher un message, avec (les trois précédentes ou une personnalisée) ou sans icône ;
- waitbarDocumentation de la fonction waitbar : affiche une barre de progression permettant à l'utilisateur de suivre la progression d'une longue tâche.
Saisie / Sélection
- inputdlgDocumentation de la fonction inputdlg : permet de saisir un ou plusieurs champs ;
- questdlgDocumentation de la fonction questdlg : permet d'afficher une question avec deux ou trois réponses possibles ;
- listdlgDocumentation de la fonction listdlg : permet la sélection d'un ou plusieurs éléments dans une liste ;
- menuDocumentation de la fonction menu : permet d'afficher un menu offrant plusieurs choix possibles ;
- uisetcolorDocumentation de la fonction uisetcolor : permet la sélection d'une couleur avec visualisation en direct ;
- uisetfontDocumentation de la fonction uisetfont : permet la sélection de la police, taille et style d'un objet TextDocumentation de l'objet Text, AxesDocumentation de l'objet Axes, ou UicontrolDocumentation de l'objet Uicontrol ;
- uicalendarDocumentation de la fonction uicalendar (disponible avec la Financial Toolbox) : permet de sélectionner une date sur un calendrier.
Interactions avec MATLAB et le workspace
- uiimportDocumentation de la fonction uiimport : permet d'importer les données d'un fichier avec prévisualisation ;
- uiopenDocumentation de la fonction uiopen : permet la sélection et l'ouverture de fichiers MATLAB (extensions *.m, *.mat, *.fig, *.mdl, et *.slx) ;
- uisaveDocumentation de la fonction uisave : permet de désigner un fichier .mat dans lequel seront sauvegardées des variables ;
- export2wsdlgDocumentation de la fonction export2wsdlg : permet l'exportation de valeurs dans le workspace sous un nom personnalisé.
Impression
- printdlgDocumentation de la fonction printdlg : affiche la boîte de dialogue d'impression, permettant de choisir l'imprimante, le nombre de copies… ;
- pagesetupdlgDocumentation de la fonction pagesetupdlg : permet de régler les paramètres d'impression : format de page, marges… ;
- printpreviewDocumentation de la fonction printpreview : affiche la prévisualisation de la zone d'impression, permettant d'ajuster avec aperçu les mêmes paramètres que pagesetupdlg.
Préférences
- uisetprefDocumentation de la fonction uisetpref, uigetprefDocumentation de la fonction uigetpref : permettent de fixer ou retrouver les préférences de l'utilisateur.
Personnalisation
- dialogDocumentation de la fonction dialog : boîte de dialogue de base, à compléter selon vos besoins.
L'utilisation basique d'un objet Uicontrol Popupmenu se résume à ses deux propriétés 'String'
et 'Value'
:
'String'
contient la liste de tous les éléments sélectionnables dans un tableau de cellules, où chaque cellule contient une chaîne de caractères représentant un élément ;'Value'
contient l'indice (du tableau de cellules précédent) de l'élément sélectionné par l'utilisateur.
Ainsi pour récupérer l'élément sélectionné, il suffit de récupérer ces deux propriétés :
elements = get(handle_du_popupmenu, 'String'
);
indice = get(handle_du_popupmenu, 'Value'
);
puis de prendre le indicee élément du tableau elements (notez les accolades) :
element_selectionne = elements{indice};
Remarque : cette récupération pourra en particulier se faire dans la fonction callback rattachée à la propriété 'Callback'
de l'objet, signifiant que l'utilisateur vient de sélectionner un nouvel élément.
Il est possible de rentrer une simple chaîne de caractères où les éléments sont séparés par des « | », mais ceci rend la récupération des éléments plus complexe, aussi je vous le déconseille.
Exemple complet :
function
exemple
uicontrol('style'
, 'popupmenu'
,...
'Position'
, [200 200 100, 20],...
'String'
, {'Item 1'
, 'Item 2'
, 'Item 3'
, 'Item 4'
},...
'Value'
, 2,... % Item 2 au début
'Callback'
, @popupmenu_Callback)
function
popupmenu_Callback(hObject, ~)
elements = get(hObject, 'String'
);
indice = get(hObject, 'Value'
);
element_selectionne = elements{indice};
fprintf('Nouvel élément sélectionné : %s\n'
, element_selectionne)