IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques Discussion :

Lancer un fichier/fonction à partir d'un bouton [Débutant]


Sujet :

Interfaces Graphiques

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Lancer un fichier/fonction à partir d'un bouton
    Bonsoir,

    Ca fait plusieurs heures que j'épluche les tutos et doc de Matlab et je touche absolument rien...

    J'aimerais, simplement, en cliquant sur un bouton, lancer des actions que j'ai dans divers fichiers.

    Par exemple, un simple import de son comme ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [s1,Fs1] = wavread('son1.wav');
    [s2,Fs2] = wavread('son2.wav');
    situé dans un fichier load_sound.m

    Dans mon fichier pour l'interface j'ai essayé plein de trucs un peu au hasard mais rien ne fonctionne.

    J'ai crée un simple bouton de ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    mais après je ne sais vraiment pas quoi mettre. Je sais que le callback doit rentrer quelque part mais je vois pas :/

    Une âme charitable pour m'aider ?

    Merci d'avance

  2. #2
    Membre éclairé Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    le callback est la fonction function pushbutton1_Callback
    tu dois faire appel aux fonctions que tu veux exécuter dans cette fonction.
    cependant les fonctions que tu veux exécuter doivent soit être définies dans le même fichier que le callback soit avoir un fichier .m spécifique qui leur est associé et qui porte leur nom.
    ex :tu pourrais faire un fichier load.m avec pour code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    function [s1,Fs1,s2,Fs2]=load(title1,title2)
    [s1,Fs1] = wavread(title1);
    [s2,Fs2] = wavread(title2);
    à toi de voir comment faire passer tes arguments

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Donc je modifie mon fichier load_sound.m

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [s1,Fs1] = wavread('son1.wav');
    [s2,Fs2] = wavread('son2.wav');
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    title1 = 'son1.wav';
    title2 = 'son2.wav';
     
    function [s1,Fs1,s2,Fs2]=load(title1,title2)
    [s1,Fs1] = wavread(title1);
    [s2,Fs2] = wavread(title2);
    ?

    Et pour appeler la fonction via le callback, ça se passe comment ? Le nom de la fonction porte le nom du fichier .m ? (load_sound ici ?)

  4. #4
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Ne surtout pas appeller sa fonction LOAD, LOAD est une fonction standard de MATLAB, elle va être écrasée si tu fais ça.

    De ce que je comprends tu as un fichier load_sound.m qui est en fait un script.
    Tu le transformes en fonction en rajoutant la ligne d'entête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function [s1,Fs1,s2,Fs2]=load_sound(title1,title2)
    [s1,Fs1] = wavread(title1);
    [s2,Fs2] = wavread(title2);
    Et tu l'appelles ensuite dans le callback :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    title1 = 'son1.wav';
    title2 = 'son2.wav';
     
    [s1,Fs1,s2,Fs2]=load(title1,title2)

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Ok, j'ai enlevé le "load".

    En fait, je dois faire un pti programme qui mixe 2 sons entre eux pour ensuite les démixer à l'aide de la méthode fastica.

    Pour ça, j'ai fait une série de script au format .m.

    J'ai ensuite crée un fichier "all.m" avec le nom de chaque script dedans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    load_sound
    mixage
    DoIca
    demixage
    affichage
    Quand je l'exécute, aucun soucis.

    J'aimerais donc créer une interface graphique avec différents boutons qui font toutes ces étapes. Donc lancer chaque script avec un bouton différent.

    Voilà pour la problématique générale.


    Ensuite, j'ai tapé ce que tu as écrit, donc un fichier load_sound.m contenant juste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function [s1,Fs1,s2,Fs2]=load_sound(title1,title2)
    [s1,Fs1] = wavread(title1);
    [s2,Fs2] = wavread(title2);
    et un fichier untitled.m avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    function untitled_OpeningFcn(hObject, eventdata, handles, varargin)
     
    handles.output = hObject;
     
    guidata(hObject, handles);
     
    function varargout = untitled_OutputFcn(hObject, eventdata, handles) 
     
    varargout{1} = handles.output;
     
     
    function pushbutton1_Callback(hObject, eventdata, handles)
    title1 = 'son1.wav';
    title2 = 'son2.wav';
     
    [s1,Fs1,s2,Fs2]=load(title1,title2)
    mais ça me renvoie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ??? Error using ==> load
    Too many output arguments.
     
    Error in ==> untitled>pushbutton1_Callback at 83
    [s1,Fs1,s2,Fs2]=load(title1,title2)
     
    Error in ==> gui_mainfcn at 96
            feval(varargin{:});
     
    Error in ==> untitled at 42
        gui_mainfcn(gui_State, varargin{:});
     
    Error in ==>
    @(hObject,eventdata)untitled('pushbutton1_Callback',hObject,eventdata,guidata(hObject))
     
     
    ??? Error while evaluating uicontrol Callback
    dans la console matlab

  6. #6
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Oui j'ai fait un copier/coller malheureux, c'est load_sound que tu dois pas appelé et pas load.

    Un petit tour par là :
    (enfin il me semble, sinon utilises l'outil de recherche de la documentation pour bien comprendre comment utiliser les fonctions)

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci, ca s'exécute. Je comprends un peu mieux le bazar et je vais aller lire la doc sur les fonctions car je les ai jamais vraiment utilisée...

    Car ca s'exécute mais ça sauvegarde pas les variables. Sûrement une histoire de output mais je vais voir avec la doc...

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Bonsoir, je reviens à la charge avec mes questions.

    J'ai un problème avec l'appel/sortie des variables dans des fonctions. J'ai lu pas mal de sujet et/ou doc et c'est très flou...

    Donc, j'ai une fonction mixage.m qui ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    54
    55
     
    %function mixage(s1,s2)
     
    function [s3] = mixage(s1,s2)
    % Blind signal separation for speech signals
     
    h12=0.2;
    h21=-0.3;
    u=0.0001;%adaptation step
    temp = s1;
    temp=temp';
    s=temp(1,:);
    N=length(s);
     
    temp = s2;
    temp=temp';
    s(2,:)=temp(1,1:N);
     
    A=[0.5 h12;h21 0.6]; %mixing matrix
    x=A*s; %mixing process
    y=zeros(2,length(s));
     
    M=[u 0;0 u]; %diagonal matrix of adaptation steps
    L=0;  %filter order, if L=0 then output y is computied using only current value of vector x(sensors)
     
    for j=0:L
       W{j+1}=eye(2);
    end                  %demixing matrixes W initialized as an identity matrix
     
    begin=3*L+1;
    for i=begin:length(s)
     
       for j=0:L
       dW{j+1}=M*(W{j+1}-(sign(fonction_mixage1(i-L,W,L,x))*fonction_mixage2(i,W,L,x)'));
       end
     
       for j=0:L
       W{j+1}=W{j+1}+dW{j+1};
       end
     
    end
     
    %source signals estimates:
    y=W{1}*x;
     
    %normalization to <-1,1>
    maks1=max(abs(y(1,:)));
    maks2=max(abs(y(2,:)));
     
    y(1,:)=y(1,:)/maks1;
    y(2,:)=y(2,:)/maks2;
     
    s1 = s(1,:);
    s2 = s(2,:);
    s3 = ((s1+s2)/2);
    J'ai donc en entrée s1 et s2 et en sortie s3.

    Ensuite, via mon interface graphique toujours sous GUIDE, j'appelle la-dite fonction et il me semble que ça fonctionne bien.

    Voilà comment je l'appelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function Mix_Callback(hObject, eventdata, handles)
     
    s1 = handles.son1;
    s2 = handles.son2;
     
    mixage(s1,s2);
    disp(s3);
    Donc évidemment ça coince pour essayer d'afficher s3...

    La question en bref est donc, comment récupérer dans mon interface, s3 qui a été crée après traitement via la fonction mixage...

    Merci d'avance

  9. #9
    Expert éminent sénior
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Points : 14 830
    Points
    14 830
    Par défaut
    Oui il faut lui dire la sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function Mix_Callback(hObject, eventdata, handles)
     
    s1 = handles.son1;
    s2 = handles.son2;
     
    s3=mixage(s1,s2);
    disp(s3);
    NB : il n'y a pas d'obligation de donner le même nom aux variables que dans l'entête de la fonction.

    On aurait très bien pu faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function Mix_Callback(hObject, eventdata, handles)
     
    res = mixage(handles.son1,handles.son2);
    disp(res);

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Ah ok, c'était si simple...

    Un grand merci pour tout.

    J'ai bien saisi le fonctionnement et l'appel/sortie des fonctions maintenant

    Et mon interface graphique tourne du tonnerre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 11/03/2014, 22h16
  2. appel d'une fonction à partir d'un bouton
    Par hammag dans le forum Langage
    Réponses: 7
    Dernier message: 04/06/2009, 19h00
  3. lancer un serveur a partir d'un bouton
    Par M E H D I dans le forum NetBeans
    Réponses: 9
    Dernier message: 13/04/2009, 12h16
  4. Réponses: 3
    Dernier message: 25/04/2006, 14h50
  5. [VBA-E] lancer un programme VB à partir d'un bouton
    Par yaya54 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 27/02/2006, 10h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo