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 Perl Discussion :

affectation de fonction dans des sous-menus


Sujet :

Interfaces Graphiques Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 14
    Points
    14
    Par défaut affectation de fonction dans des sous-menus
    Bonjour,

    j'ai commencé mon stage il y a 2 semaines, en reprenant le code d'un ancien camarade. Mon problème est le suivant :

    Le programme doit permettre d'ouvrir ou de créer différents types de fichiers. Il y a environ 6 à 8 fonctions pour créer un fichier, et autant pour l'ouverture. J'ai créé un menu fichier, et des sous menus, un pour les fonctions d'ouverture de fichier, un autre pour la création de fichiers.

    Jusque là pas de problème.

    Ce qui se complique c'est que pour chaque commande présente dans chaque sous-menu, je dois y affecter une fonction précise.

    Voici le morceau de code en question (le reste du code contient les fonctions en elle même, mais là dessus pas de problème c'est surtout l'appel des fonction qui ne marche pas ) :

    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
    #Création du menu fichier, avec des sous-menus
    #tableau contenant toutes les fonctions à lancer
    @fonction=('creerAfficherInf','creerafficherDonClassique','creerafficherDonavcan','creerAfficherLoi','creerAfficherCan','creerAfficherMaskcla','creerAfficherCancla','creerAfficherChgt','creerAfficherChgclass','ouvrirInf','ouvrirDon','ouvrirLoi','ouvrirCan','ouvrirMaskcla','ouvrirCancla','ouvrirChgt','ouvrirChgclass');
    #tableau contenant les noms des sous menus
    @fichier = ("Nouveau...","Ouvrir");
    #tableau contenant le nom des commandes dans le sous-menu Nouveau...
    my @Nouveau = ("fichier .INF","fichier .DON classique","fichier .DON canal temporel \& spectral","fichier .LOI","fichier .CAN","fichier .MASKCLA","fichier .CANCLA","fichier .CHGT","fichier .CHGCLASS");
    #tableau contenant le nom des commandes dans le sous-menu Ouvrir
    my @Ouvrir =("fichier .INF","fichier .DON","fichier .LOI","fichier .CAN","fichier .MASKCLA","fichier .CANCLA","fichier .CHGT","fichier .CHGCLASS");
    #On précise quelles commandes correspondent à quel sous-menu
    %sous_menu = (
    	"Nouveau..." => \@Nouveau,
    	Ouvrir => \@Ouvrir);
     
    my %sous_menuref;
     
    use Tk;
    use Tk::Balloon;
    use Tk::NoteBook ;
    use Tk::Dialog;
     
    $fenetre = new MainWindow();
    $fenetre -> maxsize(640,600);
    $fenetre -> minsize(640,600);
    $fenetre -> title("Cesbio TITE");
     
    $zoneMenu = $fenetre->Frame(-relief=>groove);
    #création du menu Fichier
    my $b_menu = $zoneMenu->Menubutton (-text => 'Fichier',-relief => 'flat' ,-tearoff => 0,-menuitems=>[
    			['command' => 'Quitter',-command=>sub{exit(0);}]
    			])->pack(-side=>'left');
    #création du menu Création
    my $c_menu = $zoneMenu->Menubutton (-text => 'Création',-relief => 'flat' ,-tearoff => 0,-menuitems=>[
    			['command' => 'auto_max_vrai07',-command=>\&lancerAuto_max_vrai],
    			['command' => 'auto_comp_matcnf04',-command=>\&lancerAuto_comp],
    			])->pack(-side=>'left');
     
    #Création des sous menus avec leurs commandes
    foreach my $m (@fichier) {
    	$sous_menuref{$m} = $b_menu->menu->Menu;
    	#print"@{$sous_menu{$m}}\n";
    	@a=values(%sous_menu);
    	#print "@a\n";
        map( $sous_menuref{$m}->add('command',-label => $_), @{$sous_menu{$m}} );
    	$b_menu->cascade(-label => $m);	
    	#affichage des contenus des sous-menus Nouveau... et Ouvrir
    	$b_menu->entryconfigure($m, -menu => $sous_menuref{$m});
        }
     
    $zoneMenu->pack(-side=>'top',-anchor=>'n',-expand=>1,-fill=>'x');
     
    $fenetre -> Label(-text=>"Gestion de fichier TITE")->pack(-side=>'top',-anchor=>'n');
    $zoneRecap = $fenetre -> Scrolled("Text",-width=>70,-height=>70,-background=>"white")->pack();
     
    MainLoop();
    J'ai utilisé le "cours mongeurs", qui m'a permis de créer les sous-menus, mais ils ne parlent pas d'affectation de fonctions aux commandes présentes dans les sous-menus.

    Merci d'avance de votre aide.

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Please, évitez de mettre du code non indenté et avec des erreurs. Pour vous aider en Perl/TK, on a besoin de testé vos codes quand ce n'est pas trivial, donc déposez du code lisible et sans erreurs :

    Voici le code indenté sans erreur :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    use Tk;
    use Tk::Balloon;
    use Tk::NoteBook;
    use Tk::Dialog;
     
    #Création du menu fichier, avec des sous-menus
    #tableau contenant toutes les fonctions à lancer
    my @fonction = (
        'creerAfficherInf',      'creerafficherDonClassique',
        'creerafficherDonavcan', 'creerAfficherLoi',
        'creerAfficherCan',      'creerAfficherMaskcla',
        'creerAfficherCancla',   'creerAfficherChgt',
        'creerAfficherChgclass', 'ouvrirInf',
        'ouvrirDon',             'ouvrirLoi',
        'ouvrirCan',             'ouvrirMaskcla',
        'ouvrirCancla',          'ouvrirChgt',
        'ouvrirChgclass',
    );
     
    #tableau contenant les noms des sous menus
    my @fichier = ( "Nouveau...", "Ouvrir" );
     
    #tableau contenant le nom des commandes dans le sous-menu Nouveau...
    my @Nouveau = (
        "fichier .INF",
        "fichier .DON classique",
        "fichier .DON canal temporel \& spectral",
        "fichier .LOI",
        "fichier .CAN",
        "fichier .MASKCLA",
        "fichier .CANCLA",
        "fichier .CHGT",
        "fichier .CHGCLASS",
    );
     
    #tableau contenant le nom des commandes dans le sous-menu Ouvrir
    my @Ouvrir = (
        "fichier .INF",
        "fichier .DON",
        "fichier .LOI",
        "fichier .CAN",
        "fichier .MASKCLA",
        "fichier .CANCLA",
        "fichier .CHGT",
        "fichier .CHGCLASS",
    );
     
    #On précise quelles commandes correspondent à quel sous-menu
    my %sous_menu = (
        "Nouveau..." => \@Nouveau,
        Ouvrir       => \@Ouvrir
    );
     
    my %sous_menuref;
     
    my $fenetre = new MainWindow();
    $fenetre->maxsize( 640, 600 );
    $fenetre->minsize( 640, 600 );
    $fenetre->title("Cesbio TITE");
     
    my $zoneMenu = $fenetre->Frame( -relief => 'groove' );
     
    #création du menu Fichier
    my $b_menu = $zoneMenu->Menubutton(
        -text      => 'Fichier',
        -relief    => 'flat',
        -tearoff   => 0,
        -menuitems => [ [ 'command' => 'Quitter', -command => sub { exit(0); } ] ]
    )->pack( -side => 'left' );
     
    #création du menu Création
    my $c_menu = $zoneMenu->Menubutton(
        -text      => 'Création',
        -relief    => 'flat',
        -tearoff   => 0,
        -menuitems => [
            [ 'command' => 'auto_max_vrai07', -command => \&lancerAuto_max_vrai ],
            [ 'command' => 'auto_comp_matcnf04', -command => \&lancerAuto_comp ],
        ]
    )->pack( -side => 'left' );
     
    #Création des sous menus avec leurs commandes
    foreach my $m (@fichier) {
        $sous_menuref{$m} = $b_menu->menu->Menu;
     
        #print"@{$sous_menu{$m}}\n";
        my @a = values(%sous_menu);
     
        #print "@a\n";
        map( $sous_menuref{$m}->add( 'command', -label => $_ ),
            @{ $sous_menu{$m} } );
        $b_menu->cascade( -label => $m );
     
        #affichage des contenus des sous-menus Nouveau... et Ouvrir
        $b_menu->entryconfigure( $m, -menu => $sous_menuref{$m} );
    }
     
    $zoneMenu->pack( -side => 'top', -anchor => 'n', -expand => 1, -fill => 'x' );
     
    $fenetre->Label( -text => "Gestion de fichier TITE" )
        ->pack( -side => 'top', -anchor => 'n' );
    my $zoneRecap = $fenetre->Scrolled(
        "Text",
        -width      => 70,
        -height     => 70,
        -background => "white"
    )->pack();
     
    MainLoop();

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Oups désolé, ce n'était pas volontaire de ma part

    Sinon d'après toi, et si je me suis bien exprimé, est-ce qu'il est possible de faire ce que je demande, ou bien je dois laisser tomber ? Ce n'est pas de la plus haute importance, mais disons que ça rendrait l'interface que je dois réaliser plus conviviale.

    Merci d"avance de ta réponse.

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    oui tout c'est tout à fait faisable très facilement.
    Tu peux faire autant de sous menu que tu souhaites avec en fin de cascade une action.
    J'essaye de te faire un petit d'exemple pour que tu puisses te baser dessus

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup, ça fait bien 10 jours que je galère dessus !!!

    Par contre, comme tu me dit que ça se fait facilement, j'ai l'impression de passer pour un imbécile

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Désolé pour le facilement, c'était juste pour te dire que c'est faisable et de ne pas désespérer.

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    D'ailleurs, je vois que tu utilises les Menubutton pour faire tes menus.
    Moi j'ai l'habitude d'utiliser directement le widget Menu vu que ton menu sera en entête de ton application. Donc si ça ne te déranges pas, je te propose de refaire ton menu via le widget Menu ?

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par djibril Voir le message
    Je te propose de refaire ton menu via le widget Menu ?
    Pas de problème, si c'est la meileure solution pour que mon programme fonctionne je suis totalement d'accord !

  9. #9
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    use Tk;
    use Tk::Balloon;
    use Tk::NoteBook;
    use Tk::Dialog;
    use utf8;
     
    #Création du menu fichier, avec des sous-menus
    #tableau contenant toutes les fonctions à lancer
    my @fonction = (
        'creerAfficherInf',      'creerafficherDonClassique',
        'creerafficherDonavcan', 'creerAfficherLoi',
        'creerAfficherCan',      'creerAfficherMaskcla',
        'creerAfficherCancla',   'creerAfficherChgt',
        'creerAfficherChgclass', 'ouvrirInf',
        'ouvrirDon',             'ouvrirLoi',
        'ouvrirCan',             'ouvrirMaskcla',
        'ouvrirCancla',          'ouvrirChgt',
        'ouvrirChgclass',
    );
     
    #tableau contenant les noms des sous menus
    my @fichier = ( 'Nouveau...', 'Ouvrir' );
     
    #tableau contenant le nom des commandes dans le sous-menu Nouveau...
    my @Nouveau = (
        "fichier .INF",
        "fichier .DON classique",
        "fichier .DON canal temporel \& spectral",
        "fichier .LOI",
        "fichier .CAN",
        "fichier .MASKCLA",
        "fichier .CANCLA",
        "fichier .CHGT",
        "fichier .CHGCLASS",
    );
     
    #tableau contenant le nom des commandes dans le sous-menu Ouvrir
    my @Ouvrir = (
        "fichier .INF",
        "fichier .DON",
        "fichier .LOI",
        "fichier .CAN",
        "fichier .MASKCLA",
        "fichier .CANCLA",
        "fichier .CHGT",
        "fichier .CHGCLASS",
    );
     
    #On précise quelles commandes correspondent à quel sous-menu
    my %sous_menu = (
        'Nouveau...' => \@Nouveau,
        'Ouvrir'     => \@Ouvrir,
    );
     
    my %sous_menuref;
     
    my $fenetre = new MainWindow();
    $fenetre->maxsize( 640, 600 );
    $fenetre->minsize( 640, 600 );
    $fenetre->title("Cesbio TITE");
     
    # création d'un menu bar (menu en entete du widget principal)
    my $Menu = $fenetre->Menu( -type => "menubar" );
    $fenetre->configure( -menu => $Menu, );
     
    my $SousMenuFichier = $Menu->cascade(
        -label   => "Fichier",
        -tearoff => 0,
    );
    my $SousMenuCreation = $Menu->cascade(
        -label   => "Création",
        -tearoff => 0,
    );
     
    # Sous menu Fichier
    foreach my $Label ( keys %sous_menu ) {
     
        # sous menu fichier 2
        my $SousMenuFichier2 = $SousMenuFichier->cascade(
            -label   => $Label,
            -tearoff => 0,
        );
        foreach my $fichier ( @{ $sous_menu{$Label} } ) {
            $SousMenuFichier2->command(
                -label    => $fichier,
                -command  => sub { exit; },
                -compound => "left",
            );
        }
    }
     
    $fenetre->Label( -text => "Gestion de fichier TITE" )
        ->pack( -side => 'top', -anchor => 'n' );
    my $zoneRecap = $fenetre->Scrolled(
        "Text",
        -width      => 70,
        -height     => 70,
        -background => "white"
    )->pack();
     
    MainLoop();

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Merci beaucoup de ton aide !!!

    Maintenant je n'ai plus qu'à réussir à affecter une fonction pour chaque commande dans un sous-menu !

    Tu m'as retiré une épine du pied ça fait plaisir Djibril tu es un

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Me revoilà !!!

    Je n'avais pas mis le sujet en résolu, et j'ai bien fait !!!!

    J'ai réussi à faire que mon programme appelle les fonctions. Ca à l'air de marcher, le problème est qu'il m'affiche un message de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Tk::Error: Can't call method "Toplevel" on an undefined value at /home/ducrot/guillaume/perlTITE/fichier3.pl line 1592.
     Tk callback for .#menu.#menu#fichier.#menu#fichier#nouveau_
     Tk::__ANON__ at /usr/lib/perl5/vendor_perl/5.8.6/i386-linux/Tk.pm line 247
     Tk::Menu::Invoke at /usr/lib/perl5/vendor_perl/5.8.6/i386-linux/Tk/Menu.pm line 531
    en fait, il me dit (pour chaque fonction) que ça bugue pour faire le Toplevel. Par exemple, sur la ligne 1592 de mon programme est écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $fenetreChgclass = $fenetre->Toplevel();
    Je ne comprends pas pourquoi il me ressort cette erreur, il ne me la ressortais jamais avant !!!!

  12. #12
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Can't call method "Toplevel" on an undefined value
    Tu fais appel à toplevel sur une valeur non initialisée.

    $fenetre n'existe pas au moment où tu fais appel à Toplevel.

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Ben ça me paraît bizarre que $fenetre ne soit pas déclaré, car dans mon code (après Use Tk; ...) je définis ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $fenetre = new MainWindow();
    $fenetre->maxsize( 640, 600 );
    $fenetre->minsize( 640, 600 );
    $fenetre->title("Cesbio TITE");

  14. #14
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Mets nous ton code et on t'aidera plus facilement

  15. #15
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Je rajoute le code que tu m'as corrigé, avec les petites modifications que j'y ai apporté pour le bon fonctionnement de ce que je dois faire :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    use warnings;
    use strict;
     
    use Tk;
    use Tk::Balloon;
    use Tk::NoteBook;
    use Tk::Dialog;
    use utf8;
     
    #Création du menu fichier, avec des sous-menus
    #tableau contenant toutes les fonctions à lancer
    my %fonction = (
        "Nouveau fichier .INF"=>\&creerAfficherInf,
        "Nouveau fichier .DON classique"=>\&creerafficherDonClassique,
        "Nouveau fichier .DON canal temporel & spectral"=>\&creerafficherDonavcan,
        "Nouveau fichier .LOI"=>\&creerAfficherLoi,
        "Nouveau fichier .CAN"=>\&creerAfficherCan,
        "Nouveau fichier .MASKCLA"=>\&creerAfficherMaskcla,
        "Nouveau fichier .CANCLA"=>\&creerAfficherCancla,
        "Nouveau fichier .CHGT"=>\&creerAfficherChgt,
        "Nouveau fichier .CHGCLASS"=>\&creerAfficherChgclass,
        "fichier .INF"=>\&ouvrirInf,
        "fichier .DON"=>\&ouvrirDon,
        "fichier .LOI"=>\&ouvrirLoi,
        "fichier .CAN"=>\&ouvrirCan,
        "fichier .MASKCLA"=>\&ouvrirMaskcla,
        "fichier .CANCLA"=>\&ouvrirCancla,
        "fichier .CHGT"=>\&ouvrirChgt,
        "fichier .CHGCLASS"=>\&ouvrirChgclass,
    );
     
    #tableau contenant les noms des sous menus
    my @fichier = ( 'Nouveau...', 'Ouvrir' );
     
    #tableau contenant le nom des commandes dans le sous-menu Nouveau...
    my @Nouveau = (
        "Nouveau fichier .INF",
        "Nouveau fichier .DON classique",
        "Nouveau fichier .DON canal temporel \& spectral",
        "Nouveau fichier .LOI",
        "Nouveau fichier .CAN",
        "Nouveau fichier .MASKCLA",
        "Nouveau fichier .CANCLA",
        "Nouveau fichier .CHGT",
        "Nouveau fichier .CHGCLASS",
    );
     
    #tableau contenant le nom des commandes dans le sous-menu Ouvrir
    my @Ouvrir = (
        "fichier .INF",
        "fichier .DON",
        "fichier .LOI",
        "fichier .CAN",
        "fichier .MASKCLA",
        "fichier .CANCLA",
        "fichier .CHGT",
        "fichier .CHGCLASS",
    );
     
    #On précise quelles commandes correspondent à quel sous-menu
    my %sous_menu = (
        'Nouveau...' => \@Nouveau,
        'Ouvrir'     => \@Ouvrir,
    );
     
    my %sous_menuref;
     
    my $fenetre = new MainWindow();
    $fenetre->maxsize( 640, 600 );
    $fenetre->minsize( 640, 600 );
    $fenetre->title("Cesbio TITE");
     
    # création d'un menu bar (menu en entete du widget principal)
    my $Menu = $fenetre->Menu( -type => "menubar" );
    $fenetre->configure( -menu => $Menu, );
     
    my $SousMenuFichier = $Menu->cascade(
        -label   => "Fichier",
        -tearoff => 0,
    );
    my $SousMenuCreation = $Menu->cascade(
        -label   => "Creation",
        -tearoff => 0,
    );
     
    $SousMenuCreation->command(
    	-label=>'auto_max_vrai07',
    	-command=>\&lancerAuto_max_vrai,
    	-compound=>"left",
    );
    $SousMenuCreation->command(-label=>'auto_comp_matcnf04',-command=>\&lancerAuto_comp,-compound=>"left");
     
    # Sous menu Fichier
    foreach my $Label ( keys %sous_menu ) {
     
        # sous menu fichier 2
        my $SousMenuFichier2 = $SousMenuFichier->cascade(
            -label   => $Label,
            -tearoff => 0,
        );
        foreach my $fichier ( @{ $sous_menu{$Label} } ) {
     
            $SousMenuFichier2->command(
                -label    => $fichier,
                -command  => $fonction{$fichier},
                -compound => "left",
            );
        }
    }
     
    $fenetre->Label( -text => "Gestion de fichier TITE" )
        ->pack( -side => 'top', -anchor => 'n' );
    my $zoneRecap = $fenetre->Scrolled(
        "Text",
        -width      => 70,
        -height     => 70,
        -background => "white"
    )->pack();
     
    MainLoop();

    Et voici le code de la fonction "Ouvrir -> Fichier .inf" lancée par la commande \&ouvrirInf (parce que le problème est le même que ce soit pour Toplevel ou GetOpenFile) :

    #!usr/bin/perl

    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
    sub ouvrirInf
    {
    	my @types = ( 
    		[ "Inf Files", '.inf' ] ,
    		["All Files", '*' ],
    	 ) ;
    	my $nomFichierInf = $fenetre -> getOpenFile (
    		-initialdir => '.',
    		-filetypes => \@types,
    	 ) ;
     
    	#on regarde si le fichier est un .inf
    	if($nomFichierInf =~ /(\.inf)$/){
    		open(FICH,"$nomFichierInf")||die ("Impossible d'ouvrir $nomFichierInf");
    		my @donneInf=<FICH>;
    		close(FICH);
    		creerAfficherInf(
    			"$donneInf[1]","$donneInf[0]",
    			"$donneInf[2]","$donneInf[3]",
    			"$donneInf[4]","$nomFichierInf");
    	}
    	#sinon on affiche un message d'erreur
    	else{
    		my $boiteDialogue = $fenetre -> Dialog (
    			-title => 'Ouvrir Inf' ,
    			-text => 'Ceci n\'est pas un fichier .inf' ,
    			-bitmap => 'question' ,
    			-default_button => 'OK' ,
    			-buttons => [ 'OK' ]
                )->Show() ;
    	}
    }

  16. #16
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Et pour l'instant je ne vois pas le souci , de plus il manque la procédure creerAfficherInf

  17. #17
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Voici la fonction creerAfficherInf :

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    sub creerAfficherInf
    {
    	my ($ligne,$colonne,$nbCannaux,$dataFormat,$dataType,$nomdufichierInf) = @_;
     
    	chomp($ligne);
    	chomp($colonne);
    	chomp($nbCannaux);
    	chomp($dataFormat);
    	chomp($dataType);
     
    	my $fenetreVisInf = $fenetre->Toplevel();
    	$fenetreVisInf -> title("Fichier Inf");
    	$fenetreVisInf -> raise();
     
    	if(-f $nomdufichierInf){
    		my $titre = $fenetreVisInf -> Frame();
    		$titre -> Label(
    			-text=>"$nomdufichierInf")->pack();
    		$titre -> pack(-fill=>'x');
    	}
     
    	my $visLigne = $fenetreVisInf -> Frame();
    	$visLigne -> Label(
    		-text=>"Lignes")->pack(-side=>'left');
    	$visLigne -> Button(
    		-text=>"?",
    		-relief=>'flat',
    		-borderwidth=>1,
    		-command=>sub{
    			my $fentreInfo = $fenetreVisInf -> Toplevel();
    			$fentreInfo -> title("Lignes");
    			$fentreInfo -> raise();
    			$fentreInfo -> Label(
    				-text=>"Représente \nle nombre de lignes\nde l'image")->pack();
    			$fentreInfo -> Button(
    				-text=>"Fermer",
    				-command=>sub{$fentreInfo->destroy();})->pack();
    		})->pack(-side=>"right");
    	$visLigne -> Entry(
    		-background=>'white',
    		-textvariable=>\$ligne)->pack(-side=>'right');
    	$visLigne -> pack(-fill=>'x');
     
    	my $visColonne = $fenetreVisInf -> Frame();
    	$visColonne -> Label(
    		-text=>"Colonnes")->pack(-side=>'left');
    	$visColonne -> Button(
    		-text=>"?",
    		-relief=>'flat',
    		-borderwidth=>1,
    		-command=>sub{
    			my $fentreInfo = $fenetreVisInf -> Toplevel();
    			$fentreInfo -> title("Colonnes");
    			$fentreInfo -> raise();
    			$fentreInfo -> Label(
    				-text=>"Représente \nle nombre de colonnes\nde l'image")->pack();
    			$fentreInfo -> Button(
    				-text=>"Fermer",
    				-command=>sub{$fentreInfo->destroy();})->pack();
    		})->pack(-side=>"right");
    	$visColonne -> Entry(
    		-background=>'white',
    		-textvariable=>\$colonne)->pack(-side=>'right');
    	$visColonne -> pack(-fill=>'x');
     
    	my $visNbCannaux = $fenetreVisInf -> Frame();
    	$visNbCannaux -> Label(
    		-text=>"Nombre de Cannaux")->pack(-side=>'left');
    	$visNbCannaux -> Button(
    		-text=>"?",
    		-relief=>'flat',
    		-borderwidth=>1,
    		-command=>sub{
    			my $fentreInfo = $fenetreVisInf -> Toplevel();
    			$fentreInfo -> title("Nombres de cannaux");
    			$fentreInfo -> raise();
    			$fentreInfo -> Label(
    				-text=>"Représente \nle nombre de plans\nde l'image")->pack();
    			$fentreInfo -> Button(
    				-text=>"Fermer",
    				-command=>sub{$fentreInfo->destroy();})->pack();
    		})->pack(-side=>"right");
    	$visNbCannaux -> Entry(
    		-background=>'white',
    		-textvariable=>\$nbCannaux)->pack(-side=>'right');
    	$visNbCannaux -> pack(-fill=>'x');
     
    	my $visDataFormat = $fenetreVisInf -> Frame();
    	$visDataFormat -> Label(
    		-text=>"Data Format")->pack(-side=>'left');
    	$visDataFormat -> Button(
    		-text=>"?",
    		-relief=>'flat',
    		-borderwidth=>1,
    		-command=>sub{
    			my $fentreInfo = $fenetreVisInf -> Toplevel();
    			$fentreInfo -> title("DataFormat");
    			$fentreInfo -> raise();
    			$fentreInfo -> Label(
    				-text=>"Indique le format\nde stockage des pixels :\n\n
    						1 flottant(float)\n
    						2 octet (unsigned char, 8 bits)\n
    						3 deux octets, poids fort - poids faible (16 bits, big endian)\n
    						4 deux octets, poids faible - poids fort (16 bits, little endian)",
    				-justify=>'left')->pack();
    			$fentreInfo -> Button(
    				-text=>"Fermer",
    				-command=>sub{$fentreInfo->destroy();})->pack();
    		})->pack(-side=>"right");
    	$visDataFormat -> Entry(
    		-background=>'white',
    		-textvariable=>\$dataFormat)->pack(-side=>'right');
    	$visDataFormat -> pack(-fill=>'x');
     
    	my $visDataType = $fenetreVisInf -> Frame();
    	$visDataType -> Label(
    		-text=>"Data Type")->pack(-side=>'left');
    	$visDataType -> Button(
    		-text=>"?",
    		-relief=>'flat',
    		-borderwidth=>1,
    		-command=>sub{
    			my $fentreInfo = $fenetreVisInf -> Toplevel();
    			$fentreInfo -> title("DataType");
    			$fentreInfo -> raise();
    			$fentreInfo -> Label(
    				-text=>"Le DataType signifie : \n\n
    						0 image non SAR (optique, gradient, contours, label etc.)\n\n
    						1 image SAR en intensité\n\n
    						2 image SAR en amplitude réelle\n\n
    						3 image SAR en amplitude complexe, 2 fichiers \npar canal (partie réelle et imaginaire séparées)\n\n
    						4 image SAR polarimétrique, vecteur réel\nde la matrice de covariance expérimentale\n(un fichier par élément du vecteur)",
    				-justify=>'left')->pack();
    			$fentreInfo -> Button(
    				-text=>"Fermer",
    				-command=>sub{$fentreInfo->destroy();})->pack();
    		})->pack(-side=>"right");
    	$visDataType -> Entry(
    		-background=>'white',
    		-textvariable=>\$dataType)->pack(-side=>'right');
    	$visDataType -> pack(-fill=>'x');
     
    	$fenetreVisInf -> Button(
    		-text=>"Enregistrer",
    		-borderwidth=>1, 
    		-command=>sub{
    			if(-f $nomdufichierInf){
    				enregistrerInf($nomdufichierInf,$ligne,$colonne,$nbCannaux,$dataFormat,$dataType);
    			}
    			else{
    				$nomdufichierInf = $fenetreVisInf->getSaveFile(-initialdir=>'.' );
    				enregistrerInf($nomdufichierInf,$ligne,$colonne,$nbCannaux,$dataFormat,$dataType)
    			}
    			$fenetreVisInf->destroy();	
    		})->pack();
    }
    Et voici la fonction EnregistrerInf :

    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
    sub enregistrerInf
    {
    	my($nomdufichierInf,$ligne,$colonne,$nbCannaux,$dataFormat,$dataType) = @_;
    	print " enregistrerInf $nomdufichierInf\n";
     
    	if($nomdufichierInf =~ /(\.inf)$/){
    		open(FICH,">$nomdufichierInf")||die("Impossible de créer $nomdufichierInf");
    		print FICH "$colonne\n$ligne\n$nbCannaux\n$dataFormat\n$dataType\n";
    		close(FICH);
    	}
    	else{
    		$nomdufichierInf = "$nomdufichierInf.inf";
    		open(FICH,">$nomdufichierInf")||die("Impossible de créer $nomdufichierInf");
    		print FICH "$colonne\n$ligne\n$nbCannaux\n$dataFormat\n$dataType\n";
    		close(FICH);
    	}	
    	$zoneRecap -> insert('end',"Enregistrement de $nomdufichierInf");	
    }
    J'espère que cela suffira, sinon je devrais t'envoyer mon code en plusieurs morceaux, mon fichier "fichier.pl" faisant 90ko (donc pas possible de l'envoyer en pièce jointe).

  18. #18
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bon, j'ai copié ton code. Si tu veux mettre tout code, tu peux toujours le faire sur le forum en dur.

    Néanmoins pour le moment, c'est quoi ton problème ? Car j'ai testé ton code et je n'ai pas d'erreur en dehors de
    Use of uninitialized value in scalar chomp at Z:\test.pl line 165.
    Use of uninitialized value in scalar chomp at Z:\test.pl line 166.
    Use of uninitialized value in scalar chomp at Z:\test.pl line 167.
    Use of uninitialized value in scalar chomp at Z:\test.pl line 168.
    Use of uninitialized value in scalar chomp at Z:\test.pl line 169.
    Use of uninitialized value in -f at Z:\test.pl line 175.
    Use of uninitialized value in string at Z:\test.pl line 141.
    Use of uninitialized value in string at Z:\test.pl line 141.
    Use of uninitialized value in string at Z:\test.pl line 141.
    Use of uninitialized value in string at Z:\test.pl line 141.
    Mais c'est normal d'après ton code vu que je n'ai pas de bon fichier inf avec les colonnes de données que tu souhaites.

    En résumé, que dois je faire pour voir ton problème ? et lequel ?

  19. #19
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 14
    Points
    14
    Par défaut
    Désolé je mets du temps à répondre, je suis en train d'indenté mon code à peu près correctement.

    Mon problème est quand je tente d'exécuter une commande, il me renvoie l'erreur dont j'ai parlé la dernière fois (mais je la remet quand même) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Tk::Error: Can't call method "Toplevel" on an undefined value at /home/ducrot/guillaume/perlTITE/fichier3.pl line 46.
     Tk callback for .#menu.#menu#fichier.#menu#fichier#nouveau_
     Tk::__ANON__ at /usr/lib/perl5/vendor_perl/5.8.6/i386-linux/Tk.pm line 247
     Tk::Menu::Invoke at /usr/lib/perl5/vendor_perl/5.8.6/i386-linux/Tk/Menu.pm line 531
     <ButtonRelease>
     (command bound to event)
    Quand tu exécutes le code chez toi tu n'as pas de problème ?

    Je précise que pour passer sous Unix j'utilise putty et XMing.

  20. #20
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Pour indenter ton code proprement, tu peux toujours utiliser le module perltidy

    Sinon, bah moi quand je l'exécute, en faisant ouvrir etc, j'ai pas de souci.
    Bon pour t'aider, va falloir que tu nous mettes tout ton script et des fichiers exemple à tester.

    De plus, ce serait bien de savoir ce que tu fais car de mon coté, je n'arrive pas à reproduire tes erreurs.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Appel de fonction dans des sous dossiers
    Par milach dans le forum MATLAB
    Réponses: 1
    Dernier message: 03/01/2008, 14h24
  2. Recherche de fichiers dans des sous répertoires
    Par Mimi Bulles dans le forum Langage
    Réponses: 8
    Dernier message: 25/04/2006, 16h41
  3. Filtrages dans des sous-formulaires
    Par Smint dans le forum Access
    Réponses: 4
    Dernier message: 20/09/2005, 13h56
  4. Trouver une fonctions dans des DLL
    Par Mercenary Developer dans le forum Langage
    Réponses: 2
    Dernier message: 08/09/2005, 15h28
  5. Chemin d'accès des fichiers dans des sous rep
    Par Le Veilleur dans le forum C++Builder
    Réponses: 4
    Dernier message: 17/11/2004, 14h37

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