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 :

Question sur les events


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut Question sur les events
    Bonjour. Je rencontre 3 difficultés avec tkinter:

    1/ Est-il possible d'accéder depuis un widget au callback que je lui ai passé via widget.protocol("WM_DELETE_WINDOW", callback ), ou dois-je en garder une trace moi même ?

    2/ widget.bind("<MouseWheel>", onMouseWheel) marche lorsque widget est une root/toplevel. Comment faire pour l'associer à une Frame, un button ? Typiquement, j'ai deux frames dans une fenêtre et je voudrais que les events en question affectent la frame sur laquelle je fais tourner la souris, et non toute la fenêtre.

    3/ Je crée une root.mainloop() avec un root.after(duree, root.destroy). Lorsque je fais glisser la fenêtre root avec ma souris, le after ne se déclenche pas tant que je n'ai pas relâché le bouton de la souris. Est il possible de faire autrement ?

    Merci d'avance pour votre aide

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Citation Envoyé par VV33D Voir le message
    2/ widget.bind("<MouseWheel>", onMouseWheel) marche lorsque widget est une root/toplevel. Comment faire pour l'associer à une Frame, un button ? Typiquement, j'ai deux frames dans une fenêtre et je voudrais que les events en question affectent la frame sur laquelle je fais tourner la souris, et non toute la fenêtre.
    Tel que documenté, l'event est envoyé au widget qui a le focus qui est "par défaut" la toplevel.

    Illustration
    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
    import tkinter as tk
     
    def onMouseEnter(event):
        widget = event.widget
        print ('enters widget', widget.winfo_name())
        print ('has focus: ', widget.focus_get())
        widget.focus_set()
     
    def onMouseLeave(event):
        widget = event.widget
        print ('leaves widget', widget.winfo_name())
     
    def onMouseWheel(event):
        widget = event.widget
        print ('mouse wheel widget', widget.winfo_name())
     
    root = tk.Tk()
    focus_stack = [ root ]
     
    frame = tk.Frame(root, name='frame', height=100, width=100)
    root.bind_all('<Enter>', onMouseEnter)
    root.bind_all('<Leave>', onMouseLeave)
    root.bind_all('<MouseWheel>', onMouseWheel)
    frame.pack(fill='both')
    tk.Label(frame, name='label', text='sjdfjkdhkf').pack()
    root.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Citation Envoyé par VV33D Voir le message
    3/ Je crée une root.mainloop() avec un root.after(duree, root.destroy). Lorsque je fais glisser la fenêtre root avec ma souris, le after ne se déclenche pas tant que je n'ai pas relâché le bouton de la souris. Est il possible de faire autrement ?
    Heu... Je n'arrive pas à reproduire cela en 3.2 => on ne fait pas la même chose ou le comportement n'est pas le même? Postez un exemple.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    reSalut,

    Citation Envoyé par VV33D Voir le message
    1/ Est-il possible d'accéder depuis un widget au callback que je lui ai passé via widget.protocol("WM_DELETE_WINDOW", callback ), ou dois-je en garder une trace moi même ?
    l'appel a widget.protocol("WM_DELETE_WINDOW") retourne l'identifiant tk qui a été enregistré sous la forme d'un entier suivit du nom de la fonction.
    Note: Par défaut, il y a "NNNNNNNdestroy".
    Mais pour passer de cela au callback, je ne sais pas.

    => il est "facile" de remplacer le callback par autre chose mais pour "restorer" le callback après avoir mis le sien.... il faudrait probablement sous classer la méthode "_register" pour qu'elle "stocke" des informations.

    Ceci dit je ne comprends pas trop l'intérêt de la chose!
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Merci à nouveau Wiztricks pour vos réponses

    1/ Cas d'utilisation: j'ai un décorateur de TopLevel dec1 qui rajoute un widget.protocol("WM_DELETE_WINDOW", callback1 ). J'ai un second décorateur dec2 qui souhaite rajouter sur le même widget son propre callback widget.protocol("WM_DELETE_WINDOW", callback2 ), mais sans effacer celui du 1er décorateur.

    J'avais donc espoir de faire un "widget.get_protocol_callback()" pour récupérer l'ancien callback callback1, et passer à .protocol() une combinaison des 2 callbacks

    2/ Pour etre sur de comprendre, <Enter> et <Leave> correspondent à la souris rentrant et sortant de la zone géométrique du widget ? Si c'est le cas, votre solution est nickelle.

    3/ Je suis en Python 2.6, mais j'ai commis une légère erreur d'ennoncé. Il s'agit d'un root.after(duree, root.quit) (et non pas .destroy). Le quit n'intervient pas tant que le bouton souris est enfoncé.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par VV33D Voir le message
    J'avais donc espoir de faire un "widget.get_protocol_callback()" pour récupérer l'ancien callback callback1, et passer à .protocol() une combinaison des 2 callbacks
    hmm. à part passer par une entité qui permette l'ajout de visiteurs je ne vois pas.

    2/ Pour etre sur de comprendre, <Enter> et <Leave> correspondent à la souris rentrant et sortant de la zone géométrique du widget ? Si c'est le cas, votre solution est nickelle.
    tant mieux.

    3/ Je suis en Python 2.6, mais j'ai commis une légère erreur d'ennoncé. Il s'agit d'un root.after(duree, root.quit) (et non pas .destroy). Le quit n'intervient pas tant que le bouton souris est enfoncé.
    Pour que le .quit passe, il faut que tcl_dooneevent remonte et à n'a pas l'air de fonctionner dans ce cas mais je n'ai pas le temps d'aller plus loin.

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

  7. #7
    Membre Expert 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
    Par défaut
    Bonjour,

    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
    import tkinter as tk
     
    def callback1():
        print('pass cb1')
     
    def callback2(cb1):
        print('pass cb2')
        root.tk.call(cb1)
        root.destroy()
     
    root = tk.Tk()
    c = tk.Canvas(root)
    c.pack()
    c.after(6000, root.quit)
    print(c.tk.call('after', 'info'))
    root.protocol("WM_DELETE_WINDOW", callback1)
    if "WM_DELETE_WINDOW" in root.protocol():
        cb1 = root.protocol("WM_DELETE_WINDOW")
        root.protocol("WM_DELETE_WINDOW", lambda cb=cb1: callback2(cb))
     
    root.mainloop()
    Sinon pour l'histoire du root.after(duree, root.quit) cela fonctionne pour moi donc je pense que la fonction du bind est bloquante pour l'interpréteur.
    Sinon c'est mon wm qui passe outre.

    @+

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/02/2015, 15h31
  2. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 02h38
  3. question sur les variables globales et les thread posix
    Par souris_sonic dans le forum POSIX
    Réponses: 5
    Dernier message: 13/06/2003, 13h59
  4. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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