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 :

MainLoop dans un package


Sujet :

Interfaces Graphiques Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut MainLoop dans un package
    Bonjour,
    Je developpe un GUI en perl Tk. Naturellement j'ai une MainLoop dans le programme principal du GUI.
    J'ai egalement developpé un package permettant de lancer des widgets plus particuliers qui communiquent entre eux.
    Pour developper ce package, je le lancais juste a partir d'un petit programme perl ou il n'y avait pas de MainLoop.
    Maintenant je souhaiterai utiliser ce package dans mon GUI existant, le probleme est que le package prend en compte la MainLoop du GUI et non celle du package. Du coup le code s'execute sans attendre le fermeture des widgets du package et les valeurs ainsi retournées par le package sont toutes fausses.
    Si quelqu'un sait comment forcer le package a utiliser sa MainLoop ca serait génial!!
    Merci d'avance

  2. #2
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Peux tu nous donner des exemples de codes ?
    Sinon, utilises tu les Toplevel ?
    Tu peux aussi utiliser les méthodes waitVariable

  3. #3
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut
    J'ai résumé mon probleme avec ce code. Voici mon programme principal(simplifié) qui ouvre une fenetre. En cliquant sur le bouton, on appelle une fonction qui fait appelle a une autre fonction d'un package.

    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
     
    #!/opt/perl_5.8.8/bin/perl -w
    use setSetting;
    use Tk;
     
    my $win=new MainWindow();
    my $frame=$win->Frame(-relief=>'groove',  -borderwidth=>3)->pack();
    my $label1=$frame->Label(-text=>'Press The Button')->pack();
    my $B=$frame -> Button( -text => "Next", -command => \&Set, )-> pack();
     
    MainLoop;
     
    print "ooooooooooooo  $choice  ooooooooooooooooooo\n";
    exit 0;
     
    sub Set(){$choice=setSetting::init('localRSF','drc');}

    Voici le code résumé du package:

    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
     
     
    package setSetting;
    use Tk;
    use Tk::FileSelect;
    use Tk::ItemStyle;
    use Tk::HList;
    use Tk::JComboBox;
    use vars qw($choice);
     
    sub init(){
     
    	($setting,$task) = @_;
    	eval "require $task";
     
    	%settings = map { $_->getName => $_ } $task->getTaskSettings();
    	$defaultVal = $settings{$setting}-> getDefault;
    	$type = $settings{$setting}-> getType;
    	$settingName = $settings{$setting}-> getName;
    	@values = $settings{$setting}-> getValues;
    	$choice=$defaultVal;
     
     
    	$mw = new MainWindow(-bg => 'alice blue');
    	$mw -> title( 'Demonstrator: Set Settings -Wotan2.2' );
    	$mw->fontCreate("lucida", -family=>'lucida', -size=>'12');
     
    	if($type eq 'text'){popText();}
    	if($type eq 'file'){popFile();}
    	if($type eq 'singleValue'){popSingleValue();}
    	if($type eq 'multiValue'){popMultiValue();}
    #ces fonctions ouvrent simplement des widgets, propose des choix a 
    #l'utilisateur et set la variable globale $choice, je n'ai pas trouvé util de
    #mettre leur code ici bien qu'il sot présent dans le package
    	MainLoop;
    	my @err = $settings{$setting}->validateValues($choice);
    	if(defined $err[0]){print "@err\n";}
    	return ($choice);
    }
    1;
    Le programme principal appel donc la fonction init du package cette fonction en appel d'autres qui display des widgets proposant des choix a l'utilisateur afin de mettre a jour la variable $choice setter par l'utilisateur.
    Le probleme est que le package prend en compte la MainLoop du 1er programme et non celle du package, du coup l'execution dans le package se fait d'une traite sans attendre la fermeture des fenetres, la valeur $choice est donc retournée avant que l'utilisateur ait fait son choix ce qui n'est pas bon.

  4. #4
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    1- Pense à toujours mettre ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use warnings;
    use strict;
    2- Evite le prototypage des procédures.

    et non
    3- Déclare ta variable $choice.

    Maintenant, voici comment moi je fonctionne régulièrement si j'ai des packages.
    Je passe $win par exemple en argument à ma fonction init (pour prendre ton exemple.

    Et si j'ai des widgets à créer, je crée des Toplevel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $NouveauWidget = $win->Toplevel();

  5. #5
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 19
    Par défaut
    Merci pour les conseils.
    J'ai fait les modifications indiquées, cependant je ne vois pas comment utiliser un Toplevel a la place de la MainWindow pourrait m'aider a résoudre mon probleme avec les mainLoop et effectivement ces changements n'apportent aucune modification dans le comportement du programme.

  6. #6
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Est ce possible de mettre ton code ou non (ne serait que temporairement)?
    histoire que puisse le tester?

Discussions similaires

  1. [Debutant(e)]comme utiliser un .jar dans un package
    Par dietrich dans le forum Eclipse Java
    Réponses: 13
    Dernier message: 22/12/2005, 14h57
  2. Dans quel package se trouve les fonctions C ??
    Par red210 dans le forum Linux
    Réponses: 9
    Dernier message: 18/12/2005, 20h16
  3. Problème déclaration de variable dans un package
    Par LE NEINDRE dans le forum Modules
    Réponses: 3
    Dernier message: 23/08/2005, 18h26
  4. [3.0.2]Détection des erreurs dans le Package Explorer
    Par willowII dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 18/08/2005, 18h46
  5. [VB.NET] Inclure MSDE dans le package
    Par SergeF dans le forum EDI/Outils
    Réponses: 4
    Dernier message: 24/06/2004, 21h18

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