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 :

Question à propos de la barre de menu


Sujet :

Interfaces Graphiques Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2014
    Messages : 74
    Points : 23
    Points
    23
    Par défaut Question à propos de la barre de menu
    Bonjour je débute dans le Perl Tk et je me vois attribuer le rôle de faire une interface graphique.

    Pour commencer , j'ai une barre de menu asser chargée en éléments.

    voici l'image :

    http://www.heberger-image.fr/images/...titre.png.html

    J'ai repartis les menus dans plusieurs fichier propre appelé par son nom : "File.pl" .... ect....

    Est-il possible d'appeler les fichiers pour que l'interface puisse se faire ?

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : novembre 2010
    Messages : 120
    Points : 128
    Points
    128
    Par défaut
    Je passerais pas le concept de Module

    renomme ton fichier en File.pm
    Insère au début
    Package File;
    à la fin
    return 1;

    Dans ton fichier principal
    use File;

    et dans ta routine de création de fenêtre
    File::NomDeTaRoutineDansFile

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2014
    Messages : 74
    Points : 23
    Points
    23
    Par défaut
    - Est ce normal que une fois le fichier sois mis en .pm il ne soit plus ouvrable ?

    - le Use File; est à utilisé dans la Mainloop ? ou juste avant ?

    - File::NomRoutine... Qu'est ce que la routine précisemment ? Voici un bout du code ( le code est nettement plus long )

    Fichier : Menu File

    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
    # menu File 
     
    Package File;
     
    my $menu_File = $menu_bar->cascade( -label => 'File', -tearoff => 0, ); 
    $menu_File->command( -label   => 'Open Ctrl - O', ); 
     
    my $cascade1 = $menu_File->cascade( -label => 'Open as', -tearoff => 0, );
    $menu_File->separator; 
     
    $cascade1->command( -label   => 'Slice...', );
    $cascade1->separator;
     
    $cascade1->command( -label   => 'RGB Image...', );
    $cascade1->command( -label   => 'RGB Cube...', );  
    $cascade1->separator;
     
    $cascade1->command( -label   => 'Multiple Extension Cube...', );
    $cascade1->command( -label   => 'Multiple Extension Frames...', );  
    $cascade1->separator;
    return 1;
    Fichier principal

    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
    #!/usr/bin/perl
    use warnings;
    use strict;
    use Tk;
    use Tk::FileSelect;
     
    #use File::menu_File
     
    my $txt = "Lancement";
    my $i   = 1;
    my $filename;
    my $b_var;
    my $b_menu;
     
     
    # Création fenêtre / taille / titre
     
    my $soft = MainWindow->new;
    $soft->geometry("800x550+0+0");
    $soft->title("Programme Astronomique");
     
    # Création barre de menu 
     
    my $menu_bar = $soft->Menu( -type => "menubar", ); 
    $soft->configure( -menu => $menu_bar, );
     
    MainLoop;

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : novembre 2010
    Messages : 120
    Points : 128
    Points
    128
    Par défaut
    Ouvrable ? veut tu dire exécutable ? si c'est ça, en effet, il n'y a pas de raison de l'exécuter tout seul (j'imagine qu'on peut faire des modules exécutable, mais c'est pas le sujet).

    Use File; se met en début , après tes use Tk,...

    Mon idée, il y en a surement d'autres, est de faire un
    sub menu_file {

    return $menu_File
    }
    de tout ton fichier File.pm,
    Et tu raccorches ton $menu_file au bon endroit de ta barre de menu.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2014
    Messages : 74
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    le submenu serait trop encombrant j'ai plus de 1000 lignes de menu, ça ferait nettement trop pour s'y retrouver.

    - Je ne sais toujours pas ce qu'il faut faire dans votre indication " File::NomDeTaRoutineDansFile "

    j'ai une érreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Can't locate object method "Package" via Package "File" at File.pm line 4.

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : mai 2012
    Messages : 3 612
    Points : 12 465
    Points
    12 465
    Billets dans le blog
    1
    Par défaut
    Pour déclarer un module, utilise le mot-clef package, pas Package (tout en minuscules, donc).

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : novembre 2010
    Messages : 120
    Points : 128
    Points
    128

  8. #8
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : avril 2004
    Messages : 19 793
    Points : 499 017
    Points
    499 017

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2014
    Messages : 74
    Points : 23
    Points
    23
    Par défaut
    Bonjour , j'ai regardé vos différents tutoriels et je vous avoue que c'est trop poussé et complexe pour ma part .

    Je reformule ma question / mon problème :


    j'ai crée les codes de certains menus que je souhaites faire apparaître dans ma barre de menu de ma fenêtre principale.

    Sauf qu'au total je me retrouve avec une quantité de code beaucoup trop importante, je souhaite donc , répartir chaque menu dans un fichier .pl avec son nom : File.pl, Edit.pl, Scope.pl etc....

    Pour alléger le programme principal et permettre d'ajouter les fonctions propres à chaque élément de mon menu

    Ma question est car malgré beaucoup de recherches, et aucune réponse trouvée :

    Est-il possible d'appeler un fichier .pl de façon a ce que lorsque la fonction d'appelle soit utilisée le programme irait lire la suite dans le fichier choisi :

    comme ceci :

    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
    #!/usr/bin/perl
    use warnings;
    use strict;
    use Tk;
    use Tk::FileSelect;
    
     
    my $txt = "Lancement";
    my $i   = 1;
    my $filename;
    my $b_var;
    my $b_menu;
     
     
    # Création fenêtre / taille / titre
     
    my $soft = MainWindow->new;
    $soft->geometry("800x550+0+0");
    $soft->title("Programme Astronomique");
     
    # Création barre de menu 
    
    my $menu_bar = $soft->Menu( -type => "menubar", ); 
    $soft->configure( -menu => $menu_bar, );
    
    
    # FONCTION qui ferait la même chose que si je venais mettre le code bleu qui est présent dans le  fichier File.PL a cet emplacement 
    
    
    
    my $menu_File = $menu_bar->cascade( -label => 'File', -tearoff => 0, ); 
    $menu_File->command( -label   => 'Open Ctrl - O', ); 
     
    my $cascade1 = $menu_File->cascade( -label => 'Open as', -tearoff => 0, );
    $menu_File->separator; 
     
    $cascade1->command( -label   => 'Slice...', );
    $cascade1->separator;
     
    $cascade1->command( -label   => 'RGB Image...', );
    $cascade1->command( -label   => 'RGB Cube...', );  
    $cascade1->separator;
     
    $cascade1->command( -label   => 'Multiple Extension Cube...', );
    $cascade1->command( -label   => 'Multiple Extension Frames...', );  
    $cascade1->separator;
    
    
    
    
    # go
    
    MainLoop;

  10. #10
    Membre habitué

    Profil pro
    Inscrit en
    novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : novembre 2010
    Messages : 120
    Points : 128
    Points
    128
    Par défaut
    voici un exemple

    mainmenu.pl
    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
    #!/usr/bin/perl
    use v5.10;
    use warnings;
    use strict;
    use Tk;
    use Menu;
     
    sub ajout {
        say "ok";
    }
     
    my $top = MainWindow->new();
     
    Menu::mymenu($top);
     
    MainLoop();
    Menu.pm (attention à la majuscule et l'extension)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    use v5.10;
    use warnings;
    use strict;
    use Tk;
    package Menu;
     
    sub mymenu {
        my $top=shift;
        my $mb = $top->Frame()->pack(-side=>'top');
        my $smb=$mb->Menubutton(-text=>"essai")->pack();
        $smb->command(-label=>"chercher",-command=> sub {&::ajout});
    }
     
    1;

  11. #11
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : avril 2004
    Messages : 19 793
    Points : 499 017
    Points
    499 017
    Par défaut
    Bonjour,

    Je vais répéter les dires des mes amis ci-dessus. Si tu souhaites scinder ton code, cela veut dire changer la conception de ton programme et pour cela, il faut faire de la programmation objet. De ce fait, tu vas devoir créer plusieurs petits modules .pm. Le fait de faire ainsi t'imposera aussi beaucoup de gymnastiques car tu devras trouver des solutions dans le partage de certaines variables, méthodes (procédures)... en fonction des actions de tes différents sous menus car je suis presque sûr que chacun de tes sous menus n'est pas totalement indépendant.
    Bref, cela t'imposera je pense la réécriture de tout ton code.
    On n’allège pas un code en copiant juste quelques lignes que l'on copie dans quelques fichiers de gauche à droite. Cette sale programmation engendre énormément de soucis de déclaration de variables, d'erreurs vicieuses et une maintenance impossible.
    Je rajouterais aussi que programmer en Perl/TK, du moins en programmation d'interfaces graphiques (quelques soit le langage) demande toujours beaucoup de réflexions car ce n'est plus de la programmation procédurale basique.

    À toi de voir si tu es motivé à tout refaire !

    N.B. alainbb, ton code ci-dessus ne me plait pas. Pas vraiment top comme programmation objet .

  12. #12
    Membre habitué

    Profil pro
    Inscrit en
    novembre 2010
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : novembre 2010
    Messages : 120
    Points : 128
    Points
    128
    Par défaut
    Je l'aime pas trop non plus mais c'est la réponse à minima à la question.
    L'exemple n'est en effet pas du tout objet, c'est juste mettre du code dans un fichier séparé.
    Et en effet, en écrivant &::ajout, je me suis dit "aïe, les variables globales".

  13. #13
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    septembre 2011
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : septembre 2011
    Messages : 1 376
    Points : 2 023
    Points
    2 023
    Par défaut
    Bonjour,
    Citation Envoyé par Thornn654
    Sauf qu'au total je me retrouve avec une quantité de code beaucoup trop importante, je souhaite donc , répartir chaque menu dans un fichier .pl avec son nom : File.pl, Edit.pl, Scope.pl etc....
    Pour alléger le programme principal et permettre d'ajouter les fonctions propres à chaque élément de mon menu
    Je crois comprendre que tu souhaites faire des sortes "d'include" comme en C#...
    Ce n'est pas prévu en Perl.

    S'il ne s'agit que de mettre une partie de la construction de la fenêtre à part pour alléger le code principal vu que :
    Citation Envoyé par Thornn654
    le submenu serait trop encombrant j'ai plus de 1000 lignes de menu
    Il est possible de jouer au prix de se tordre les boyaux de la tête en plaçant l'entête dans un module, comme précisé plus haut...

    De là à faire plusieurs modules et à les inclure de façon conditionnelle du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if ( $LANG eq "F") {
      use Menu_1;
    } else {
      use menu_2;
    }
    et de plus, y inclure des fonctions...
    Tu t'embarques dans plusieurs galères à la fois !!!

    Bon voici une piste rudimentaire, pas orthodoxe du tout, qui te laisseras sur ta faim... et te permettra de mesure l'ampleur des difficultés...

    Thornn654.pl :
    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
    #!/usr/bin/perl
    use warnings;
    use strict;
    use Tk;
    use Tk::FileSelect;
    use Tk::LabFrame;
     
    my $txt = "Lancement";
    my $i   = 1;
    my $filename;
    my $b_var;
    my $b_menu;
    my $Lib;
     
    use Menu;
     
    SuiteWin();
    Prog();
     
    MainLoop;
     
    sub SuiteWin {
    	# Cadre Gestion
    	my $cadre_gestion = $Menu::soft->LabFrame(
    		-label      => 'Gestion',
    		-background => '#AA00FF',
    	);
     
    	# Start
    	my $bouton_start = $cadre_gestion->Button(
    		-text    => "Start",
    	);
     
    	# Stop
    	my $bouton_stop = $cadre_gestion->Button(
    		-text    => "Stop",
    	);
     
    	# Exit
    	my $bouton_exit = $cadre_gestion->Button(
    		-text    => "Exit",
    		-command => [ \&Fermer, ],
    	);
     
    	# Label qui affichera les messages, en bas
    	my $label_message = $Menu::soft->Label(
      	-textvariable => \$Menu::Lib,
      	-background  => '#FFE0D0',
      	-relief      => 'groove',
    	);
     
    	####################################
    	# Gestion de l'affichage des widgets
    	#
    	$label_message->pack(qw / -side bottom -fill both -expand 0 /);
    	$cadre_gestion->pack(qw / -side right -fill both -expand 1 /);
    	$bouton_start->grid( $bouton_stop, $bouton_exit,
    		qw / -padx 2 -pady 5 -sticky nsew /
    	);
    }
     
    sub Prog {
    	Menu::Coucou;
    }
     
    sub Fermer {
    	exit (0);
    }
    Menu.pm :
    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
    #!/usr/bin/perl
    package Menu;
    use warnings;
    use strict;
    use Tk;
    use Tk::FileSelect;
     
    # Création fenêtre / taille / titre
     
    our $soft = MainWindow->new;
    $soft->geometry("400x250+0+0");
    $soft->title("Programme Astronomique");
     
    our $menu_bar = $soft->Menu( -type => "menubar", ); 
    $soft->configure( -menu => $menu_bar, );
     
    our $menu_File = $menu_bar->cascade( -label => 'File', -tearoff => 0, ); 
    $menu_File->command( -label   => 'Open Ctrl - O', ); 
     
    our $cascade1 = $menu_File->cascade( -label => 'Open as', -tearoff => 0, );
    $menu_File->separator; 
     
    $cascade1->command( -label   => 'Slice...', );
    $cascade1->separator;
     
    $cascade1->command( -label   => 'RGB Image...', );
    $cascade1->command( -label   => 'RGB Cube...', );  
    $cascade1->separator;
     
    $cascade1->command( -label   => 'Multiple Extension Cube...', );
    $cascade1->command( -label   => 'Multiple Extension Frames...', );  
    $cascade1->separator;
     
    sub Coucou {
    	our $Lib = "Coucou";
    	print "print $Lib depuis Menu.pm";
    }
     
    1;

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    juin 2014
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : juin 2014
    Messages : 74
    Points : 23
    Points
    23
    Par défaut
    Bonjour

    Je commence à comprendre effectivement un peu mieux comment se déroule le codage.

    Cependant j'ai une autre petite requête:

    Avec votre code il est possible d'afficher effectivement un élément de la barre de menu, j'ai essayé pour un autre élément sachant que j'en ai 10.

    Il subsiste un soucis, pour ce second élément, il semblerait qu'il soit nécessaire que le fichier .pm contienne la phase de code qui crée la fenêtre et la barre de menu,

    Est-il possible de désigner une fenêtre déjà crée ? Mainwindow -> ? plutôt que d'en recrée une ?


    Merci

  15. #15
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : avril 2004
    Messages : 19 793
    Points : 499 017
    Points
    499 017
    Par défaut
    Désolé dmgange, mais le code proposé ne me plait pas.
    Si tu veux faire quelque chose de propre, c'est de la programmation objet qu'il faut faire avec création de constructeur, héritage...
    Pour ta question Est-il possible de désigner une fenêtre déjà crée ? Mainwindow -> ? plutôt que d'en recrée une ?

    C'est oui et cela rentre dans toute la logique de programmation qui t’amènera à te tordre les meninges car il te faudra jouer avec les passages d'arguments dans tous les sens. Ces argument seront des fenêtres, des widgets, des variables quelconques...

  16. #16
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    septembre 2011
    Messages
    1 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : septembre 2011
    Messages : 1 376
    Points : 2 023
    Points
    2 023
    Par défaut
    Je suis tout à fait d'accord djibril !
    Citation Envoyé par dmganges
    Bon voici une piste rudimentaire, pas orthodoxe du tout, qui te laisseras sur ta faim... et te permettra de mesure l'ampleur des difficultés...
    Il s'agissait pour moi de faire ressortir les difficultés avenir, et notamment l'utilisation des variables internes au module dans le programme principal... une aberration...
    Mais une aberration n'est pas une impossibilité absolue !
    Citation Envoyé par Thornn654
    Est-il possible de désigner une fenêtre déjà crée ? Mainwindow -> ? plutôt que d'en recrée une ?
    Visiblement je n'ai pas été suffisamment clair

Discussions similaires

  1. [AC-2010] Masquer la barre de menu taper une question
    Par ThieBEN dans le forum VBA Access
    Réponses: 0
    Dernier message: 02/06/2014, 10h07
  2. Réponses: 13
    Dernier message: 09/06/2009, 10h55
  3. Réponses: 2
    Dernier message: 12/05/2006, 14h20
  4. barre de menu principal
    Par norfelt dans le forum IHM
    Réponses: 10
    Dernier message: 27/10/2003, 11h37
  5. Comment créer des barres de Menu ?
    Par MoKo dans le forum IHM
    Réponses: 5
    Dernier message: 30/07/2003, 14h58

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