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 :

Clics gauches et droits simultanés pour déclencher action.


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Profil pro
    Client Solution Developer
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Client Solution Developer

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Points : 21
    Points
    21
    Par défaut Clics gauches et droits simultanés pour déclencher action.
    Bonjour,

    je souhaiterais appeler une fonction non pas en relâchant le clic gauche de la souris ("<ButtonRelease-1>"), ni le clic droit ("<ButtonRelease-3>") mais en relâchant les deux simultanéments.

    J'ai essayé quelques opérateurs tels que "+" (voir exemple ci-dessous) mais sans résultat!

    Quelqu'un peut-il éclairer ma lanterne? Merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    canevas.bind ("<ButtonRelease-1>"+"<ButtonRelease-3>", action)

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Salut,

    J'ai comme l'impression que tu demandes l'impossible, là.

    Ces deux événements seront toujours séparés dans le temps, ce n'est pas comme avec les modifiers, Shift, Ctrl, Alt, etc. qui sont observables en même temps qu'un autre touche.

    Pareil pour le clavier d'ailleurs, on n'intercepte pas deux touches (non modifiers) en même temps.

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Amusant en fait

    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
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
     
    def action(value, liste=[]):
        def delete(): # Utiliser lambda ?
            del liste[:]
     
        if value not in liste:
            liste.append(value)
        if len(liste) == 2:
            label.config(text='go')
            del liste[:]
        root.after(10, delete)  # Ajuster le timer ?
     
    root = Tk.Tk()
    root.title('Test Tk')
    label = Tk.Label(root)
    label.pack()
    root.bind ("<ButtonRelease-1>", lambda event=None: action(1))
    root.bind ("<ButtonRelease-3>", lambda event=None: action(2))
    Tk.Button(root, text='Quitter', command=root.quit).pack()
    root.mainloop()
    @+

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 301
    Points : 6 781
    Points
    6 781
    Par défaut
    Ouais, j'avais bien pensé aussi à un timer, une solution de ce genre avait été évoquée sur la mailing list PyQt pour saisir un double-click là ou un simple click déclenchait déjà un évènement.

    Je reste dubitatif malgrés tout.

    Cela dit, il faudra que tu conserves une référence de ta liste, sinon l'action deux n'ayant qu'un seul argument remettra la liste à zéro.

    Si je lis bien.

  5. #5
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 947
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Ne pourrait-on pas tester l'état des 2 boutons? On n'exécute l'action que si les deux boutons sont enfoncés.

    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
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
     
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
     
    def action(var, state, other_var):
        print var, state, other_var
        var.set(state)
        if var.get() and other_var.get():
            win.quit()
     
    win = Tk.Tk()
    mouse_bt_state1 = Tk.IntVar(value=False)
    mouse_bt_state2 = Tk.IntVar(value=False)
     
    bt = Tk.Button(win, text='CLIQUEZ LES 2 BOUTONS EN MEME TEMPS')
    bt.bind ("<ButtonRelease-1>", lambda event=None: action(mouse_bt_state1, False, mouse_bt_state2))
    bt.bind ("<ButtonRelease-3>", lambda event=None: action(mouse_bt_state2, False, mouse_bt_state1))
    bt.bind ("<ButtonPress-1>", lambda event=None: action(mouse_bt_state1, True, mouse_bt_state2))
    bt.bind ("<ButtonPress-3>", lambda event=None: action(mouse_bt_state2, True, mouse_bt_state1))
    bt.grid()
    win.mainloop()
    A+

    Pfeuh

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Si ce n'est que je ne vois pas l’intérêt* de passer les deux instances je préfère largement cette solution à after.

    *
    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
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
     
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
     
    def action(var, state):
        print var, state
        var.set(state)
        if mouse_bt_state1.get() and mouse_bt_state2.get():
            win.quit()
     
    win = Tk.Tk()
    mouse_bt_state1 = Tk.BooleanVar(value=False)
    mouse_bt_state2 = Tk.BooleanVar(value=False)
     
    bt = Tk.Button(win, text='CLIQUEZ LES 2 BOUTONS EN MEME TEMPS')
    bt.bind ("<ButtonRelease-1>", lambda event=None: action(mouse_bt_state1, False))
    bt.bind ("<ButtonRelease-3>", lambda event=None: action(mouse_bt_state2, False))
    bt.bind ("<ButtonPress-1>", lambda event=None: action(mouse_bt_state1, True))
    bt.bind ("<ButtonPress-3>", lambda event=None: action(mouse_bt_state2, True))
    bt.grid()
    win.mainloop()

  7. #7
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 947
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Si ce n'est que je ne vois pas l’intérêt* de passer les deux instances je préfère largement cette solution à after.
    L'intérêt est qu'il faut les 2 instances à la fin de la fonction action pour voir si les 2 touches sont enfoncées simultanément.

  8. #8
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 947
    Points : 1 351
    Points
    1 351
    Par défaut
    Il y a effectivement moyen de n'utiliser qu'un booleen. Si le booléen est à True et qu'un True arrive par new_value, c'est qu'on a appuyé les 2 boutons.

    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
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
     
    def action(var, new_value):
        old_value = var.get()
        if old_value == new_value and old_value == True and new_value == True:
            win.quit()
        else:
            var.set(new_value)
    win = Tk.Tk()
    bt_clicked = Tk.BooleanVar(value=False)
    bt = Tk.Button(win, text='CLIQUEZ LES 2 BOUTONS EN MEME TEMPS')
    bt.bind ("<ButtonRelease-1>", lambda event=None: action(bt_clicked, False))
    bt.bind ("<ButtonRelease-3>", lambda event=None: action(bt_clicked, False))
    bt.bind ("<ButtonPress-1>", lambda event=None: action(bt_clicked, True))
    bt.bind ("<ButtonPress-3>", lambda event=None: action(bt_clicked, True))
    bt.grid()
    win.mainloop()

Discussions similaires

  1. JTable avec 2 Editors : pour clic Droit et clic Gauche
    Par F Barbier dans le forum Composants
    Réponses: 6
    Dernier message: 11/12/2008, 17h38
  2. Clic gauche + droit ?
    Par oliwan dans le forum Tkinter
    Réponses: 2
    Dernier message: 11/04/2007, 00h11
  3. [JTable] Simuler clic gauche après clic droit
    Par Oliveuh dans le forum Composants
    Réponses: 1
    Dernier message: 03/12/2004, 12h35
  4. gérer le clic gauche-droite en même temps de la sou
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 29/11/2002, 22h52

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