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 :

event_generate: évènement virtuel ignoré


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2015
    Messages : 2
    Par défaut event_generate: évènement virtuel ignoré
    Bonjour,
    j'ai un soucis avec event_generate. La méthode fonctionne très bien quand dans ma classe j'hérite de Frame par exemple mais avec l'exemple ci-dessous l'évènement virtuel "<<TEST>>" est ignoré. Pourquoi?
    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
    41
    import tkinter as tk
    import tkinter.filedialog as tkf # python3
     
    class MonMenu(tk.Menu):
        def __init__(self, racine=None):
            "Le constructeur de la menubar"
            tk.Menu.__init__(self, racine)
            self.racine=racine
            self.createMenu()
     
        def createMenu(self):
            self.add_cascade(label="File", menu=self.createFileMenu())
     
        def createFileMenu(self):
            #=============================================File option
            m=tk.Menu(self, tearoff=0)
            m.add_command(label="Open Text", command=self.cmdText)
            m.add_command(label="Save", command=lambda : self.emptyCmd("File.Save"))
            m.add_separator()
            m.add_command(label="Exit", command=self.racine.quit)
            return m
     
        def emptyCmd(self, menu):
            print("in emptyCmd:",menu)
     
        def cmdText(self):
            print("in cmdTest")
            self.event_generate("<<TEST>>")
     
     
        def getData(self):
            print("in getData")
            return "Data"  
     
    if __name__ == '__main__':
        print("in main")
        root=tk.Tk()
        menu=MonMenu(root)
        root.config(menu=menu)
        root.bind_all("<<TEST>>", menu.getData)
        root.mainloop()
    Merci pour votre aide.
    Cordialement,

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

    Citation Envoyé par Wurtzjm Voir le message
    j'ai un soucis avec event_generate. La méthode fonctionne très bien quand dans ma classe j'hérite de Frame par exemple mais avec l'exemple ci-dessous l'évènement virtuel "<<TEST>>" est ignoré. Pourquoi?
    En écrivant self.event_generate("<<TEST>>"), la fenêtre qui recevra l'event est le Menu (le "self").
    Je ne sais pas trop à qui vous voulez l'expédier, mais "root" (me) semble plus approprié.

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

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Janvier 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2015
    Messages : 2
    Par défaut
    Bonjour,
    merci pour votre réponse, j'avais déja vérifié que "root.event_generate("<<TEST>>")" activait l'évènement. Mais il me faut le bon widget ou je définis la méthode getData() que je souhaite accéder au travers de event.widget. Avec root, getData() n'est pas connu
    Avec l'exemple du Frame ci-dessous à la place de Menu cela fonctionne très bien.
    La structure du code ci-dessous est celle que j'aimerai mettre en place aussi avec Menu. Mais il semblerait que bind ne fonctionne pas de la même manière avec Frame et Menu.
    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
     
    import tkinter as tk
    import tkinter.filedialog as tkf # python3
     
    class MonFrame(tk.Frame):
        def __init__(self, racine=None):
            "Le constructeur de la menubar"
            tk.Frame.__init__(self, racine)
            self.racine=racine
            self.data="hello"
            self.createWidget()
     
        def createWidget(self):
            self.lab=tk.Label(self, text="un label", bg="yellow")
            self.lab.pack()
            self.b=tk.Button(self,
                             text="Mon boutton",
                             bg="red",
                             command=self.cb_button)
            self.b.pack()
     
        def cb_button(self):
            print("in cb_button")
            self.event_generate("<<TEST>>")
     
        def getData(self):
            return self.data
     
    def etranger(event):
        w=event.widget
        print("in getData", w.getData())
        return w.getData()
     
    if __name__ == '__main__':
        print("in main")
        root=tk.Tk()
        f=MonFrame(root)
        f.pack()
        root.bind_all("<<TEST>>", etranger)
        root.mainloop()
    Quelle différence existe-t-il en terme de gestion des évènement entre MENU et FRAME?
    Est-il possible d'avoir le même comportement avec Menu?
    Merci pour votre aide.
    Cordialement,

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

    Citation Envoyé par Wurtzjm Voir le message
    Quelle différence existe-t-il en terme de gestion des évènement entre MENU et FRAME?
    Est-il possible d'avoir le même comportement avec Menu?
    Aucune idée: il faudrait passer du temps dans les sources pour essayer de comprendre.
    Ceci dit je ne comprends pas trop l'intérêt: vous cherchez à faire quoi?
    Je suppose que c'est pour expédier un message à une autre fenêtre (et non à la même fenêtre comme dans votre exemple). Passer par event_generate permet de masquer à l'appelant la méthode qui sera invoquée via "<<TEST>>", mais vous devez quand même connaître le widget de destination.
    Rien ne vous empêche de définir une méthode "interface générique" style "on_test" et son exécution permettra d'appeler une autre méthode.
    Vous pouvez même utiliser .after_idle pour que l'appel soit "asynchrone".

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/12/2007, 22h34
  2. Modification de l'évènement OnClick
    Par MrJéjé dans le forum C++Builder
    Réponses: 9
    Dernier message: 22/08/2002, 12h52
  3. Redéfinir l'événement OnExit de mon composant TEditFloat
    Par Seb des Monts dans le forum C++Builder
    Réponses: 5
    Dernier message: 18/06/2002, 16h10
  4. Existe-t-il un langage de prog "virtuel" en Français
    Par HRS dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 10/06/2002, 18h11
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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