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

Tkinter Python Discussion :

clic de souris


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut clic de souris
    J'aurais voulu que 1 clic fasse passer à l'image suivante: de la 1 à la 2, puis au clic suivant de la 2 à la 3..... Or là je passe directement au premier clic de la première image(1) à la dernière l'image(6). Pourriez vous me dire où est la faille.. Je début en python. merci




    Code python 3.x : 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
    from tkinter import *
     
    def im(p):
        global image
        image= PhotoImage(file="image_"+str(p)+".gif")
        return(image)
     
    def Clic(event):
        canvas.destroy()
        global canvas
        canvas=Canvas(fen, width=120, height=120)
        canvas.create_image(40,40,image=im(p))
        canvas.pack()
        return
     
    fen = Tk()
    #première image
    canvas = Canvas(fen, width=120, height=120)
    ima1 = PhotoImage(file="image_1.gif")
    canvas.create_image(40,40,image=ima1)
    canvas.pack()
     
    #succession des images par clic
    for i in range(3,7,1):
        p=i
        canvas.bind("<Button-1>", Clic)
     
    fen.mainloop()
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Salut,

    Citation Envoyé par 58Stephane Voir le message
    Je début en python. merci
    Pour programmer avec tkinter, il faut déjà avoir acquis un peu les bases de la programmation, sinon çà décoiffe vite.

    Citation Envoyé par 58Stephane Voir le message
    Pourriez vous me dire où est la faille..
    Dans Clic, ajoutez un "print(p)" et regardez ce qu'il se passe.
    Puis en relisant votre code, vous essayez de comprendre le pourquoi de cette valeur.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Le problème vient du fait que la méthode .bind() permet ici de paramétrer l'action à effectuer lors d'un clic de souris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    canvas.bind("<Button-1>", Clic)
    Cette instruction ordonne au programme d'utiliser la fonction Clic lors d'un clic de souris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in range(3,7,1):
        p=i
        canvas.bind("<Button-1>", Clic)
    Cette boucle s'effectue avant que l'utilisateur n'ait pu effectuer le moindre clic et ainsi lorsque celui-ci appuiera sur le bouton de sa souris, la variable p aura pour valeur 6 (ce qui correspond bien à la fin de la boucle) et ainsi ce sera ce paramètre qui sera utilisé lors de l'appel de la fonction Clic :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    canvas.create_image(40,40,image=im(p))
    Pour corriger ce problème, vous pourriez par exemple insérer une boucle for dans la fonction Clic et non à l'extérieur de celle-ci. Cela permettra d'afficher successivement les image de la première à la sixième (il est possible d'utiliser le module time par exemple afin de mettre un délai entre chaque image pour que l'utilisateur puisse visualiser chaque image).

    Je vous laisse donc chercher par vous-même car la solution n'est pas très compliquée.
    Cependant, comme le souligne wiztricks :

    Pour programmer avec tkinter, il faut déjà avoir acquis un peu les bases de la programmation, sinon çà décoiffe vite.
    je vous conseille de vous pencher davantage sur toutes les possibilités qu'offrent Tkinter avant de continuer car vous risquez d'être rapidement bloqué, ce module étant particulièrement vaste et difficile à utiliser.

    N'hésitez pas à partager votre code corrigé si vous avez besoins d'autres conseils...

    ~ OI0I0I0I0IO ~

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Salut,

    Citation Envoyé par OI0I0I0I0IO Voir le message
    Pour corriger ce problème, vous pourriez par exemple insérer une boucle for dans la fonction Clic et non à l'extérieur de celle-ci. Cela permettra d'afficher successivement les image de la première à la sixième (il est possible d'utiliser le module time par exemple afin de mettre un délai entre chaque image pour que l'utilisateur puisse visualiser chaque image).
    Essayez d'écrire le code que vous suggérez, vous constateriez que c'est un peu plus compliqué...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Invité
    Invité(e)
    Par défaut
    En effet, en essayant de corriger le problème de 58Stephane, j'ai rapidement été confronté à un problème concernant les changements d'images dans un canvas Tkinter car au lieu d'afficher une nouvelle image, l'image contenue dans le canvas disparaît...

    Il est vrai que Tkinter est très complexe et peu de solutions sont proposées sur internet pour résoudre ce problème...

    Puis-je vous demander, par curiosité et par envie d'en apprendre davantage, comment vous vous y seriez pris afficher chaque image l'une après l'autre (le module time n'étant en effet pas adapté puisqu'il interrompt totalement le programme...).


    J'ai pensé que cela serait facile puisque c'est tout a fait réalisable avec le module Pygame que je juge (peut-être à tort) plus performant que Tkinter et pour lequel j'ai plus d'aisance pour programmer.

    Merci.

    ~ OI0I0I0I0IO ~

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut essai d'amélioration
    Merci pour vos réponses. J'ai essayé de mettre la boucle dans la définition de la fonction Clic. Ca affiche la première et la dernière. La boucle est parcourue? Mais l'image initiale n'est pas détruite.. et les suivantes pas affichées.
    De plus il faudrait que le changement d'image se fasse à chaque clic. Ai-je des chances d'y parvenir? Merci de votre aide.

    Code python3.x : 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
     
    from tkinter import *
     
    def im(p):
        global image
        image= PhotoImage(file="image_"+str(p)+".gif")
        return(image)
     
    def Clic(event):
        global canvas
        for p in range(2,7,1):# affichage successif des 5 images
            canvas.destroy()
            canvas=Canvas(fen,width=120,height=120)
            canvas.create_image(40,40,image=im(p))
            canvas.pack()
            time.sleep(2)
            print(p)
     
    fen = Tk()
     
    #première image
    canvas = Canvas(fen, width=120, height=120)
    ima1 = PhotoImage(file="image_1.gif")
    canvas.create_image(40,40,image=ima1)
    canvas.pack()
     
    #succession des images par clic
    canvas.bind("<Button-1>", Clic)
     
    fen.mainloop()

  7. #7
    Invité
    Invité(e)
    Par défaut
    C'est en effet le même problème que j'ai eu en réfléchissant à votre code...

    Je pense que wiztricks sera plus apte à vous répondre que moi. Je puis cependant vous conseiller de vous orienter vers le module Pygame qui propose des fonctionnalités tout aussi intéressantes et plus faciles à prendre en main pour un débutant.

    Si vous êtes intéressé par ce module je peux vous apporter mon aide car je possède un assez bon niveau en Pygame/PIL mias mes compétences sont assez réduites autour du module Tkinter.

    Désolé de ne pas pouvoir vous aider davantage.

    ~ OI0I0I0I0IO ~

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Salut,

    Citation Envoyé par 58Stephane Voir le message
    De plus il faudrait que le changement d'image se fasse à chaque clic. Ai-je des chances d'y parvenir?
    L'image à afficher est une fonction de p.
    Donc à chaque clic, si vous voulez afficher l'image suivante, il faut incrémenter ce p et afficher l'image correspondante. Et pour que clic récupère la valeur précédente de p, il faut (aussi) faire de p une variable globale.
    note: vous avez tout ce qu'il faut pour écrire le code, juste que "penser son code" avec tkinter est différent de ce que vous connaissez. C'est pour çà qu'il faut "apprendre" (et çà peut être long car c'est pas si trivial).

    Citation Envoyé par OI0I0I0I0IO Voir le message
    J'ai pensé que cela serait facile puisque c'est tout a fait réalisable avec le module Pygame que je juge (peut-être à tort) plus performant que Tkinter et pour lequel j'ai plus d'aisance pour programmer.
    pygame ne se compare pas à tkinter: çà ne se programme pas pareil et chaque bibliothèque sera plus adaptée pour un type d'applications/domaine défini.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Invité
    Invité(e)
    Par défaut
    Si le simple but de l'application est d'effectuer un changement d'image lors d'un clic à la souris, il me semble que Pygame soit tout indiqué...

    Si le programme nécessite une interaction plus importante avec l'utilisateur (bouton, entry, comboBox...) alors Tkinter sera plus adapté...

    Dans notre cas et si le programme se limite seulement à faire défiler des images lors d'un clic souris, l'utilisation de Pygame est peut être plus intéressante si on la couple avec le module pillow pour gérer les images.

    ~ OI0I0I0I0IO ~

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut événement
    bonjour,
    j'ai beau avoir essayer de mettre la variable p en global à plusieurs endroits.. j'ai la première et dernière image. La variable p balaie pourtant les valeurs de 1 à 6. Mais seules s'affichent la première et la dernière image. La pause dans la boucle ne sert à rien. Il faudrait que ma fonction clic ait deux paramètres : event et p mais c'est impossible. Et en pas sur que ça marche. Pourriez vous me dire les raisons pour lesquelles je n'ai pas le résultats attendus et si c'est possible?
    Et de plus je l'ai laissé mais le module time ne sert a priori pas.
    Merci
    Code python 3.x : 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
     
    from tkinter import*
    import time
     
    def im(p):
        global image
        image= PhotoImage(file="image_"+str(p)+".gif")
        return(image)
     
    def Clic(event):
        global canvas
        for p in range(2,7,1):# affichage successif des 5 images
            canvas.destroy()
            canvas=Canvas(fen,width=120,height=120)
            canvas.create_image(40,40,image=im(p))
            canvas.pack()
            time.sleep(3)
            print(p)
     
    fen = Tk()
     
    #première image
    canvas = Canvas(fen, width=120, height=120)
    ima1 = PhotoImage(file="image_1.gif")
    canvas.create_image(40,40,image=ima1)
    canvas.pack()
    global p
    #succession des images par clic
    canvas.bind("<Button-1>", Clic)
     
    fen.mainloop()

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Salut,

    Relisez le code que vous avez écrit! Est ce que votre fonction clic se contente d'incrémenter p et d'afficher l'image correspondante?
    Si lorsque vous relisez votre code, vous n'y retrouvez pas vos petits: çà n'a aucune chance de marcher.

    Et si vous aviez pris le temps d'apprendre les bases plutôt que de vous lancez à jouer avec tkinter, vous sauriez décomposer votre problème en sous problèmes et ramenez cela à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> p = 0
    >>> def f():
    ...     global p
    ...     p += 1
    ...     print('afficher', p)
    ...
    >>> f()
    afficher 1
    >>> f()
    afficher 2
    >>> f()
    afficher 3
    >>>
    c'est la même structure/construction.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut gestion des événements
    Merci pour vos indication que je vais essayer d'utiliser. je n'ai pas choisi tkinter.. c'est imposé. Par contre il y a une chose que je ne comprends pas. Lorsque la fonction clic est appelée, il y une boucle qui tourne 5 fois. Elle comprend une suppression de canvas, puis une création et enfin un affichage d'images. Cette succession devrait apparaître 5 fois.. or il n'en est rien. Pourquoi. On m'a appris que les instructions se succédaient. Et là il n'en est rien. Pourriez vous m'expliquer d'ou cela vient.
    Il y a sans doute un lien avec clic lié au bouton de la souris.
    Merci

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 781
    Points
    36 781
    Par défaut
    Citation Envoyé par 58Stephane Voir le message
    Lorsque la fonction clic est appelée, il y une boucle qui tourne 5 fois. Elle comprend une suppression de canvas, puis une création et enfin un affichage d'images. Cette succession devrait apparaître 5 fois.. or il n'en est rien. Pourquoi.
    Parce que "clic" est plus qu'une fonction, c'est un callback qui sera appelé par tkinter lorsqu'on clique sur le Button.
    Et le boulot d'un callback, c'est de poster des mises à jour qui s'empilent dans une boucle d'évènements qui ne sera dépilée qu'après le retour de la fonction i.e. lorsque tkinter aura la main pour dépiler. A ce moment là, vous pouvez imaginer qu'il fait tout d'un seul coup... et côté "rendu" (ce qui s'affiche) on ne voit que la dernière image.

    Citation Envoyé par 58Stephane Voir le message
    Merci pour vos indication que je vais essayer d'utiliser. je n'ai pas choisi tkinter.. c'est imposé.
    Avoir pris le temps d'apprendre avec un tuto. avant de poster est aussi imposé (par les règles de ces forums).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut faire de son mieux
    merci pour votre réponse.
    je vais me pencher sur les callback.. Mais le temps est limité. On a deux projets à faire en trois semaines: le premier c'est du cryptage, des maths et ça c'est fini. Il reste celui là. Et pas que ça à côté.. Le temps est donc compté.
    Je me replonge dans le code avec vos indication.
    Merci

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut encore deux heures
    Je vous remercie pour toutes les infos que vous m'avez données. Je renonce pour ce projet. Je rendrai un de ceux qui fonctionne au clic mais donne directement la dernière image..

    Je reviendrai d'ici la fin de l'année parce qu'il n'est pas sur qu'on ait la solution... Dans la promo pas un seul a traité ce projet.

    Pas grave.. Avec l'autre j'aurai la moyenne.

    Merci encore

  16. #16
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2019
    Messages : 7
    Points : 3
    Points
    3
    Par défaut avancé du code
    Bonjour,

    je m'y suis remis une petite heure et il y a du mieux..il me reste à mettre une condition d'arrêt aux clics pour ne pas dépasser le nombre d'image..En fait la réponse était sur la dernière ligne depuis le début...loop..looping = boucle.
    Merci pour votre aide

    Code python 3.x : 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
     
    from tkinter import*
     
    def on_click(event):
        global k
        print("Position de la souris:", event.x, event.y)
        canvas=Canvas(fen, width=100, height=100)
        print(k)
        canvas.create_image(40,40,image=im(k))
        #canvas.pack(side=RIGHT)
        canvas.grid(column=0,row=0,padx=5,pady=5,sticky=N)
     
        k=k+1
     
    def im(p):
        global ima
        ima = PhotoImage(file="image_"+str(p)+".gif")
        return ima
     
    k=1
    fen =Tk()
    fen.bind("<Button-1>", on_click)
    fen.mainloop()

Discussions similaires

  1. [Debutant] Menu sur clic de souris
    Par chabannou dans le forum Windows
    Réponses: 8
    Dernier message: 02/04/2005, 01h52
  2. Réponses: 8
    Dernier message: 14/03/2005, 21h43
  3. Emuler et detecter un clic de souris (G, D, mollette)
    Par méphistopheles dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/02/2005, 17h25
  4. Réponses: 2
    Dernier message: 12/07/2004, 11h43
  5. Selection par clic de souris
    Par bilbonec dans le forum OpenGL
    Réponses: 7
    Dernier message: 16/04/2004, 00h25

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