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 :

Tk et Canvas [perl6]


Sujet :

Interfaces Graphiques Perl

  1. #1
    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 Tk et Canvas
    Bonjour,

    Mon but principal étant de dessiner, j'essaye de lancer un canvas, mais après quelques modifications, je bloque quand même.
    Le script en perl 5 (introduction à Perl/Tk)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $c = $mw->Scrolled("Canvas")->pack();
    $canevas = $c->Subwidget("canvas");
    $canevas->Tk::bind("<Button-1>", [ \&affiche_xy, Ev('x'), Ev('y') ]);
    sub affiche_xy {
    my ($canev, $x, $y) = @_;
    print "(x,y) = ", $canev->canvasx($x), ", ",
    $canev->canvasy($y), "\n";
    }
    Le mien

    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
     
    #!/opt/rakudo-star/install/bin/perl6
     
    use Inline::Perl5;
    use Tk:from<Perl5>;
     
    sub getXY($canev,$x,$y) {
        say $canev.canvasx($x), $canev.canvasy($y);
    }
     
    my $window=MainWindow.new();
    $window.title('KanDeLa');
     
    my $drawing=$window.Scrolled('Canvas','-width',400,'-height',300,'background','white').pack();
     
    my $plan=$drawing.Subwidget("canvas");
    $plan.createOval(0,0,150,150);
    $plan.CanvasBind("<Button-3>", {say('ok')});
    $plan.CanvasBind("<Button-1>",  <getXY  Ev('x') Ev('y')>);
     
    MainLoop;
    Le click avec le bouton droit (3) fonctionne, mais pas avec celui avec le bouton gauche (1)
    J'ai comme message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Tk::Error: Failed to AUTOLOAD 'Tk::Canvas::getXY' at -e line 0.
     Carp::croak at /usr/share/perl/5.24/Carp.pm line 167
     Tk::Widget::__ANON__ at /usr/lib/x86_64-linux-gnu/perl5/5.24/Tk/Widget.pm line 347
     <Button-1>
     (command bound to event)
    Une idée ?

    PS : J'ai aussi des Warning, je pense non-bloquant pour ce que je veux faire, est-ce corrigeable ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Use of inherited AUTOLOAD for non-method Tk::Frame::AddScrollbars() is deprecated at /usr/lib/x86_64-linux-gnu/perl5/5.24/Tk/Widget.pm line 1284.
    Use of inherited AUTOLOAD for non-method Tk::Frame::freeze_on_map() is deprecated at blib/lib/Tk/Frame.pm (autosplit into blib/lib/auto/Tk/Frame/AddScrollbars.al) line 233.
    Use of inherited AUTOLOAD for non-method Tk::Frame::queuePack() is deprecated at blib/lib/Tk/Frame.pm (autosplit into blib/lib/auto/Tk/Frame/scrollbars.al) line 357.

  2. #2
    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
    Bonjour,

    je n'ai plus utilisé TK depuis presque 20 ans et ce n'était même pas en Perl à l'époque. Je ne suis donc pas vraiment en mesure de t'aider, mais je proposerai peut-être quand même une toute petite piste: je constate que la définition de la fonction getXY a trois paramètres et que l'appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $plan.CanvasBind("<Button-1>",  <getXY  Ev('x') Ev('y')>);
    semble ne passer que deux paramètres. Comme getXY est une subroutine et non une méthode, elle ne peut prendre un invoquant comme paramètre implicite.

    Voir aussi si préfixer getXY avec un sigil & dans l'appel à la méthode CanvasBind améliore les choses.

    Sinon, un autre toolkit graphique a été (partiellement) porté sur Perl 6: gtk. Peut-être offre-t-il ce dont tu as besoin...

  3. #3
    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
    Bonjour,

    Je ne suis pas sûr de ce que je dis, mais je pense qu'on passe en paramètre une fonction getXY (affiche_xy en perl5) et autre chose... Ev(x), et que tk appelle le getXY en passant le canvas et les valeurs de x et de y.
    J'ai essayé le & devant mais ça ne fonctionne pas et semble congruant à ce que j'ai pu lire du passage de 5 à 6 où le & ne serait plus nécessaire voir interdit.
    Concernant gtk, il vient récement d'inclure le canvas, mais pas encore la détection du pointeur du souris et du click (interactivité).

    Merci quand même.

  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
    Bonjour,

    Et comme indiqué dans le message d'erreur, il ne trouve pas getXY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tk::Error: Failed to AUTOLOAD 'Tk::Canvas::getXY' at -e line 0.
    donc, si je mets cela dans Tk/Canvas.pm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    sub getXY
    {
            print("essai @_ \n");
            my $canev=shift;
            print $canev.canvasx(shift), $canev.canvasy(shift),"\n";
            return;
    }
    Le premier print fonctionne, mais le deuxième ne trouve pas Ev
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tk::Error: Can't locate object method "WidgetMethod" via package "Ev('x')" (perhaps you forgot to load "Ev('x')"?) at /usr/lib/x86_64-linux-gnu/perl5/5.24/Tk.pm line 251.
    Et j'imagine qu'il ne trouve pas Ev, car il n'est pas appelé du bon endroit.

    J'imagine qu'il faut dire à Tk::bind, que la fonction qu'on passe est dans le programme principal, et non dans Canvas;pm.

    Une idée ?

  5. #5
    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
    Citation Envoyé par alainbb Voir le message
    J'ai essayé le & devant mais ça ne fonctionne pas et semble congruant à ce que j'ai pu lire du passage de 5 à 6 où le & ne serait plus nécessaire voir interdit.
    Non, non seulement il n'est pas interdit, mais il est parfois indispensable. Voici un exemple sous le REPL, dans lequel je définis une fonction deux-fois qui exécute deux fois la fonction qui lui est passée en paramètre, puis une fonction hello que je vais passer à la première fonction:

    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
     
    > sub deux-fois ($sub) {$sub(); $sub();}
    sub deux-fois ($sub) { #`(Sub|162780000) ... }
    > sub hello { say "Hello world!"; }
    sub hello () { #`(Sub|162780152) ... }
    > deux-fois hello;    # ne fonctionne pas correctement
    Hello world!
    No such method 'CALL-ME' for invocant of type 'Bool'
      in sub deux-fois at <unknown file> line 1
      in block <unit> at <unknown file> line 1
     
    > deux-fois &hello;    # là, ça marche
    Hello world!
    Hello world!
    >
    Comme on le voit, le sigil & est nécessaire pour que Perl 6 sache que l'on veut passer la fonction en argument et non l'exécuter immédiatement.

    Bien sûr, on peut aussi passer à deux-fois une fonction anonyme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    > deux-fois { say "Hello world!" }
    Hello world!
    Hello world!
    Il est également préférable d'utiliser le sigil & dans la signature et le corps de la fonction deux-fois.

    Essayons avec la définition actuelle de passer une chaîne de caractères à la fonction deux-fois:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    > deux-fois "toto";
    No such method 'CALL-ME' for invocant of type 'Str'
      in sub deux-fois at <unknown file> line 1
      in block <unit> at <unknown file> line 1
    J'ai une erreur, c'est normal puisque ça n'a pas de sens de passer une chaîne de caractères à la fonction, mais le message d'erreur n'est pas très clair.

    Si maintenant je définis la fonction deux-fois comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > sub deux-fois (&sub) {&sub(); &sub();}
    sub deux-fois (&sub) { #`(Sub|132158392) ... }
    > deux-fois "toto"
    Type check failed in binding to parameter '&sub'; expected Callable but got Str ("toto")
      in sub deux-fois at <unknown file> line 1
      in block <unit> at <unknown file> line 1
     
    >
    Le message d'erreur est plus clair: la fonction deux-fois attend une fonction ou un bloc de code exécutable (un objet de type Callable) et je lui passe une chaîne de caractères.

    Avec cette nouvelle définition, j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    > deux-fois hello
    Hello world!
    Type check failed in binding to parameter '&sub'; expected Callable but got Bool (Bool::True)
      in sub deux-fois at <unknown file> line 1
      in block <unit> at <unknown file> line 1
     
    > deux-fois &hello
    Hello world!
    Hello world!
    >

  6. #6
    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
    Oui, en effet, j'ai mélangé avec autre chose.
    Et en effet, avec le &, ça a l'air d'aller plus loin, mais ça bloque encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Tk::Error: Attempt to load 'Tk::Canvas::&getXY' at /usr/lib/x86_64-linux-gnu/perl5/5.24/Tk/Widget.pm line 287.
    	Tk::Widget::AUTOLOAD(Tk::Canvas=HASH(0x56132fe6ca18), "Ev('x')", "Ev('y')") called at /usr/lib/x86_64-linux-gnu/perl5/5.24/Tk.pm line 424
    	eval {...} called at /usr/lib/x86_64-linux-gnu/perl5/5.24/Tk.pm line 424
    	Tk::MainLoop() called at -e line 0
    	eval {...} called at -e line 0
     Carp::confess at /usr/share/perl/5.24/Carp.pm line 168
     Tk::Widget::AUTOLOAD at /usr/lib/x86_64-linux-gnu/perl5/5.24/Tk/Widget.pm line 287
     <Button-1>
     (command bound to event)

  7. #7
    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
    Citation Envoyé par alainbb Voir le message
    Le premier print fonctionne, mais le deuxième ne trouve pas Ev
    Et tu l'appelles comment, cette fonction getXY? Perce que si tu lui passes deux arguments, le troisième shiftne trouvera rien.

  8. #8
    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 ne maîtrise pas les appels de fonction de ce type.
    Je me suis basé sur l'exemple de perl 5 (en début du fil de discussion). C'est fait de la même manière. (l'exemple est tiré de "Inroduction à perl/tk)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    $canevas->Tk::bind("<Button-1>", [ \&affiche_xy, Ev('x'), Ev('y') ]);
    sub affiche_xy {
    my ($canev, $x, $y) = @_;
    ...
    Tu as une idée d'un forum anglais où je pourrais poser la question ?

  9. #9
    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
    Citation Envoyé par alainbb Voir le message
    Tu as une idée d'un forum anglais où je pourrais poser la question ?
    Tu peux essayer d'envoyer un mail à la liste de diffusion perl6-users@perl.org (les messages et réponses se retrouvent sur le site https://www.nntp.perl.org/group/perl.perl6.users). C'est sans doute là que tu trouveras les meilleurs spécialistes de Perl 6, avec sans doute des gens connaissant aussi TK.

    Sinon, essayer dans la rubrique Perl 6 de Stack Overflow, il y a généralement beaucoup de réponses.

    Il y a aussi Perl Monks, mais il y a assez peu de questions sur P6.

    Évite cependant de poster simultanément sur plusieurs de ces sites (c'est assez mal vu), ou, si tu le fais, prends soin d'indiquer clairement que tu poses aussi la question ailleurs, en indiquant l'URL de cet ailleurs (le but étant d'éviter dans la mesure du possible la duplication de travail entre différents forums).

  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
    Pourquoi aller chercher midi à 14 heures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $plan.CanvasBind("<Button-1>",  [&getXY, Ev('x'), Ev('y')]);
    :-)

  11. #11
    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
    Et ça, ça marche?

    Si c'est le cas, j'ai finalement bien fait de parler du sigil & (même si c'était un "tir dans la nuit", à tout hasard) et d'insister ensuite.

  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
    Oui, oui. Ca marche, sinon, je n'aurais pas mis "résolu".
    Je ne sais évidemment plus les tests que j'ai fait il y a quelques jours et qui m'a poussé à changer les [ en <, mais voilà dans ce cas, c'était pas la bonne idée.

  13. #13
    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 pense avoir retrouvé.
    Le code que j'ai envoyé est un code simplifié pour bien cibler le problème.
    Mais pour du vrai, j'avais commencé à mettre ce qui concerne Tk dans un .pm, et la, le Bind ne fonctionne pas du tout quel que soit les & \ [ <, bon j'ai pas tout essayé. :-)
    Et donc, dans un premier temps, je vais tout réintégrer dans le .pl , et un jour peut-être je fouillerai...

  14. #14
    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
    Bonsoir,

    As-tu regardé cet exemple ?

    https://perl.developpez.com/tutoriel...-canevas#LIX-U

  15. #15
    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
    Citation Envoyé par djibril Voir le message
    As-tu regardé cet exemple ?
    Oui, oui, évidemment, j'ai le livre depuis 20 ans :-)

    Le souci ici, c'est l'application à perl6. J'ai trouvé ce qui ne fonctionne pas, c'est pas une histoire de pm. Ci-dessous un code qui dysfonctionne, par contre si on décommente la ligne 17, ça marche. Je comprends pas, mais bon... pas grave pour l'instant.

    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
    #!/opt/rakudo-star/install/bin/perl6
     
    use Inline::Perl5;
    use Tk:from<Perl5>;
     
    sub getXY($canev,$x,$y) {
        say $canev.canvasx($x), $canev.canvasy($y);
    }
     
    my $window=MainWindow.new();
    $window.title('KanDeLa');
     
    my $drawing=$window.Scrolled('Canvas','-width',400,'-height',300,'background','white').pack();
     
    my $plan=$drawing.Subwidget("canvas");
    $plan.createOval(0,0,150,150);
    #$plan.CanvasBind("<Button-3>", {say('ok')});
    $plan.CanvasBind("<Button-1>",  [&getXY, Ev('x'), Ev('y')]);
     
    MainLoop;

  16. #16
    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
    ok

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

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