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 :

saisie simultanée dans deux zones différentes


Sujet :

Tkinter Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Par défaut saisie simultanée dans deux zones différentes
    Bonjour,

    Je suis toujours un très petit débutant en python et je voulais savoir s'il était possible qu'une saisie au clavier dans un éditeur (par exemple sous IDLE) puisse apparaître aussi dans un champ de type Entry (ou autre) de tkinter.
    Avec le code ci-dessous, je ne peux saisir que directement dans le champ texte_saisi=tkinter.Entry
    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
     
    import tkinter
     
    def main():
        #Création de la fenêtre principale nommée racine
        racine=tkinter.Tk()
        racine.title("Principale")
    #Création de <<bouton>> de type Button pour fermer l'application
        bouton=tkinter.Button(racine,text='Quitter',command=racine.destroy)
        bouton.pack(side=tkinter.BOTTOM)
     
    #Création de <<zone_saisie>> de type Entry où est tapé le texte
        texte_saisi=tkinter.StringVar()
        zone_saisie=tkinter.Entry(racine,textvariable=texte_saisi,width=80)
        zone_saisie.pack()
     
        racine.mainloop()
     
    if __name__ == '__main__':
        main()
    Maintenant je souhaiterais que le texte que je tape sur Idle apparaisse simultanément dans le champ <<zone_saisie>>; est-ce possible?


    Merci pour vos réponses.

    Gabriel

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 439
    Par défaut
    Voir du côté de event et tkinter

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Par défaut
    OK merci pour le lien.

    Je vais analyser tout çà...

    Gabriel

  4. #4
    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,

    Cela ne fonctionneras pas avec les events Tkinter en dehors de ce qui concerne l'instance Tk().
    Si vous voulez capturer la frappe cela se passe au niveau système (msvcrt.getch() sous Windows et sans doute win32 (Pas trop mon domaine: Lire les exemples vb), Carbon.Evt sous Mac, tty/termios sous Tux...).
    Une recherche de getch sur le forum vous montreras des exemples.
    J'ai cela qui 'traine'
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    #
    #
    try:
        import Tkinter as Tk
    except:
        import tkinter as Tk
    import threading
    import sys
     
    class SetAffichage(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
            self._stopevent = threading.Event()
            self._getch = _Getch()
     
        def run(self):
            while not self._stopevent.isSet():
                _lettre = self._getch()
                if _lettre.isalpha():
                    # A eviter bien sur mais pour simplifier l'exemple.
                    l['text'] = _lettre
     
        def stop(self):
            self._stopevent.set()
     
    class _Getch:
        def __init__(self):
            if sys.platform == 'linux2':
                self.getch = _GetchUnix()
            elif sys.platform == 'win32':
                self.getch = _GetchWindows()
            elif sys.platform == 'darwin':
                self.getch = _GetchMac()
            else:
                pass # TODO
     
        def __call__(self):
            return self.getch()
     
    class _GetchUnix:
        def __init__(self):
            import tty
     
        def __call__(self):
            import tty, termios
            _fd = sys.stdin.fileno()
            _old_settings = termios.tcgetattr(_fd)
            try:
                tty.setraw(sys.stdin.fileno())
                ch = sys.stdin.read(1)
            finally:
                termios.tcsetattr(_fd, termios.TCSADRAIN, _old_settings)
            return ch
     
    class _GetchWindows:
        def __init__(self):
            import msvcrt
     
        def __call__(self):
            import msvcrt
            import time
            while not msvcrt.kbhit():
                time.sleep(0.1)
            return msvcrt.getch()
     
    class _GetchMac:
        def __init__(self):
            import Carbon
     
        def __call__(self):
            import Carbon
            # A finir
            if Carbon.Evt.EventAvail(0x0008)[0] == 0:
                return ''
            else:
                (what, msg, when, where, mod) = Carbon.Evt.GetNextEvent(0x0008)
                return chr(msg & 0x000000FF)
     
    def Intercepte(event=None):
        trhvar.stop()
        root.destroy()
        sys.exit(0)
     
    root = Tk.Tk()
    root.protocol("WM_DELETE_WINDOW", Intercepte)
    root.bind('<3>', Intercepte)
    root.bind("<Control-Key-c>", Intercepte)
    Tk.Label(root, bg='white', fg='red', text='test fullscreen').pack(pady=10)
    l = Tk.Label(root, bg='white', width=50)
    l.pack(pady=10)
    Tk.Button(root, text='Quitter', command=Intercepte).pack()
    root.geometry("%dx%d+0+0"% (root.winfo_screenwidth(), root.winfo_screenheight()))
    root['bg'] = 'black'
    root.wm_attributes("-topmost", 1, "-fullscreen", 1)
    # root.overrideredirect(1)
    trhvar = SetAffichage() # Utiliser .after() plutot qu'un thread. thread ici pour l'exemple.
    trhvar.start()
    root.mainloop()
    @+

    Edit : Et pyhook

  5. #5
    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
    Rien dit (j'ai tester sous linux et cela ne fonctionne pas).
    Regardez du coté de pyhook.

  6. #6
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    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 : 952
    Par défaut
    Salut,

    As tu vraiment besoin de passer par une saisie console? Parce qu'on peut faire une saisie en graphique telle que tu la désires en console.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    import sys
    try:
        import tkinter
    except:
        import Tkinter as tkinter
    import tkSimpleDialog
     
    class GRABBED_INPUT(tkinter.Toplevel):
        def __init__(self, stringvar, status_var, prompt):
            tkinter.Toplevel.__init__(self)
            self.title(sys.argv[0])
            self.status_var = status_var
            self.status_var.set(True)
            tkinter.Label(self, text=prompt).pack()
            tkinter.Entry(self, textvariable=stringvar, width=80).pack()
            tkinter.Button(self, text="OK", width=8, command=self.ok).pack()
            tkinter.Button(self, text="CANCEL", width=8, command=self.cancel).pack()
            self.protocol('WM_DELETE_WINDOW', self.cancel)
     
        def grab(self):
            self.grab_set()
            self.focus()
            self.mainloop()
     
        def ok(self):
            self.quit()
            self.destroy()
     
        def cancel(self):
            self.status_var.set(False)
            self.ok()
     
    def askTkStringVar(stringvar, prompt):
        old_value = stringvar.get()
        status_var = tkinter.BooleanVar()
        win = GRABBED_INPUT(stringvar, status_var, prompt)
        win.grab()
        if win.status_var.get() == False:
            stringvar.set(old_value)
     
    if __name__ == '__main__':
     
        racine=tkinter.Tk()
        racine.title(sys.argv[0])
        texte_saisi=tkinter.StringVar(value='azerty')
        bouton=tkinter.Button(racine,text='Saisir',command=lambda stringvar=texte_saisi, prompt="Entrez une chaine":askTkStringVar(stringvar, prompt)).pack()
        for x in range(5):
            tkinter.Entry(racine, textvariable=texte_saisi, width=80).pack()
        racine.mainloop()

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

    Je n'avais vraiment pas compris la question comme cela.
    J'avais penser que le PO voulait faire un keylogger (capturer la saisie générale du système) pour l'afficher dans un Widget Tkinter.
    C'est pour cela que j'avais parler de pyhook (Windows).
    @Ruyneau: Pourriez confirmer votre besoin ? Le système d'exploitation de même (pyhook ne fonctionne que sous Windows mais il est possible de faire de même sous les autres systèmes).

    @+

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

    Oups... Je viens de regarder les posts du PO. En gros c'est pour faire de l’auto-complétion.
    Donc:
    D'après les derniers posts vous avez déjà la solution pyhook.
    Après cela vous savez que le dialogue avec les applications n'est pas simple.
    Pourquoi ne pas faire un popup (par exemple une fenêtre style postit et facile a faire en Tk) pour proposer des orthographes ? C'est bien plus simple.

    @+

    Edit: Et évitez de vous disperser comme cela sur le forum.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Par défaut
    Bonjour,

    Effectivement, mon objectif est de faire un petit utilitaire d'auto-complétion.

    J'arrive à récupérer le mot en cours de saisie avec pyhook (version 2.7.2 de python) Si pour la proposition des mots à compléter c'est plus simple de faire un popup, je suis preneur. Mais, je ne sais pas (encore) faire de popup en python... je vais chercher et est-il alors possible d'intégrer une liste de mot dans le popup?

    Je vous remercie de vos réponses.

    Si vous avez un lien à me conseiller pour la création des popup, je suis preneur.

    A bientôt

    Gabriel

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

    Pour ce qui est de faire un popup il vous suffit de jouer sur la géométrie de l'instance Tk (vous avez un exemple avec le Widget Toplevel dans les sources, c'est pareil pour le root Tk). Vous pouvez positionner cela grâce aux coordonnées de la souris.
    Il vous suffit de modifier le texte contenu pour faire votre proposition.
    Je n'utiliserais pas de mainloop() pour cela, bien que la doc de pyhook dise qu'en cas de GUI pythoncom est inutile car les GUI ont leurs propres event manager, mais la méthode update().

    @+

    Ps: Si vous recherchez des mots.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Par défaut
    Bonsoir,

    je pense que la difficulté pour moi n'est pas dans la création et la gestion des fenêtres et des widgets avec tkinter (j'arrive à le faire sur d'autres exemples).

    Ce que je n'arrive pas à faire c'est que la fenêtre créée avec tkinter puisse restée <<active>> et <<réagir>> à ce que tape l'utilisateur sur un traitement de texte (texnicenter, word, ...).

    En fait, je souhaiterais que la fenêtre de complémentation automatique créée avec tkinter se superpose (et être active) à la fenêtre ouverte de n'importe quel éditeur de texte et que le focus reste sur le traitement de texte.

    Comme je ne suis pas du tout informaticien, ma question est sans doute mal formulée ou alors (ça peut être les deux) je crois encore au père Noël (c'est presque le jour j) et ce que je recherche est impossible...

    Merci

    Gabriel

  12. #12
    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,

    Ce n'est pas impossible.

    Du moment ou vous pouvez faire un print du caractère vous pouvez l'afficher dans un Label et comme vous le dite vous même 'J'arrive à récupérer le mot en cours de saisie avec pyhook'.
    Si a partir de ce mots récupéré vous pouvez faire une proposition alors vous pouvez l'afficher dans un Label au lieu de faire un print.

    Ce que je n'arrive pas à faire c'est que la fenêtre créée avec tkinter puisse restée <<active>> et <<réagir>> à ce que tape l'utilisateur sur un traitement de texte (texnicenter, word, ...).
    En fait, je souhaiterais que la fenêtre de complémentation automatique créée avec tkinter se superpose (et être active) à la fenêtre ouverte de n'importe quel éditeur de texte et que le focus reste sur le traitement de texte.
    Vous savez maintenant comment la positionner par rapport à la géométrie, pour ce qui est de la mettre en premier plan c'est avec .wm_attributes()
    <<intancetk>>.wm_attributes("-topmost", 1)
    (A noter que pour le raffinement vous pouvez, sous Windows, utiliser l'attribut "-alpha" (transparence))
    Comme montré dans le lien pour ne pas avoir de bordure on utilise .overrideredirect(True). Un autre exemple ici qui se base sur la taille du Toplevel et la géométrie de l'écran.

    A dire vrais toute la difficulté dans votre code est que vous vous utilisez des threads différents. Je n'ai pas de poste Windows pour vous montrer cela mais voici un bout de code utilisant pyxhool.py (pykeylogger).
    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
    42
    43
    44
    45
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    #
    #
    import Tkinter as Tk
    import threading
    import pyxhook as ph
     
     
    class Master(threading.Thread):
        def __init__(self):
            threading.Thread.__init__(self)
            self.hm = ph.HookManager()
            self.hm.HookKeyboard()
            self.hm.KeyDown = self.on_event
            self.hm.start()
     
     
        def run(self):
            self.window = Interface()
            self.window.wm_attributes("-topmost", 1, "-alpha", 0.75)
            # A vous de jouer pour la géométrie
            self.window.overrideredirect(1)
            self.window.mainloop()
            self.hm.cancel()
            self._Thread__stop()
     
        def on_event(self, event):
            self.window.capture['text'] = self.window.capture['text'] + event.Key
     
     
    class Interface(Tk.Tk):
        def __init__(self):
            Tk.Tk.__init__(self)
            self.title("keylogger")
            self.capture = Tk.Label(self)
            self.capture.pack()
            Tk.Button(self, text="Quit",command=self.on_exit).pack()
     
        def on_exit(self):
            self.destroy()
     
    if __name__ == '__main__':
        app = Master()
        app.start()
    @+

  13. #13
    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
    Re,

    J'allais oublier: Pour ne faire apparaître l'interface que lorsque vous avez un mots a proposer utilisez .withdraw()/.deiconify()

    @+ et bon code.

    Edit: J'utilise ici un thread (threading) mais vous pouvez utiliser une classe pour lancer tout le 'machin'.
    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
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    #
    #
    import Tkinter as Tk
    import pyxhook as ph
     
     
    class Master:
        def __init__(self):
            self.hm = ph.HookManager()
            self.hm.HookKeyboard()
            self.hm.KeyDown = self.on_event
            self.hm.start()
     
        def run(self):
            self.window = Interface()
            self.window.wm_attributes("-topmost", 1, "-alpha", 0.75)
            # A vous de jouer pour la géométrie
            self.window.overrideredirect(1)
            self.window.mainloop()
            self.hm.cancel()
     
        def on_event(self, event):
            self.window.capture['text'] = self.window.capture['text'] + event.Key
     
     
    class Interface(Tk.Tk):
        def __init__(self):
            Tk.Tk.__init__(self)
            self.title("keylogger")
            self.capture = Tk.Label(self)
            self.capture.pack()
            Tk.Button(self, text="Quit",command=self.on_exit).pack()
     
        def on_exit(self):
            self.destroy()
     
    if __name__ == '__main__':
        app = Master()
        app.run()
    @++

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Par défaut des petits progrès....
    Bonsoir,

    Je n'ai pas encore compris les modules class et l'intéret du <<self>>.

    J'ai donc adapté les derniers programmes et j'ai fait apparaitre une listbox au lieu d'un label.

    Par ailleurs j'utilise pyHooks.

    Plusieurs problèmes apparaissent dans le code ci-dessous:
    1. lorsque je clique sur le bouton <<quitter>> de la fenetre le <<hook>> continue à tourner alors que je souhaiterais arreter définitivement le programme
    2. L'appel de la fonction selection ne fonctionne pas; il y a certainement un problème de transfert de variable mais là je ne connais pas la syntaxe pout dire qu'il s'agit de la fenetre fen_compl
    3. Lorsque la fenetre fen_compl s'affiche (par exemple en tappant "c", ile devrait apparaitre une proposition de 4 mots) le curseur sur le fichier actif disparait or je souhaiterais qu'il reste actif pour que l'utilisateur puisse continuer à saisir son mot


    Ci joint le code.
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    # -*- coding: utf8 -*-
    import pyHook
    import Tkinter as tkinter
    import pythoncom
     
    def mots_pour_complements():
        """Liste des mots susceptibles d'être complétés - qui sera remplacée par une liste de mots dans un fichier"""
     
        liste_mots=['convivial','Déterminer','déterminer','si et seulement si','ensemble','solution','condition','nécessaire',
        'suffisante','condiment','par contre','contretemps','seulement','Seulement','Par contre','Par ailleurs',
        'Résoudre','résoudre','événement','alpha','beta']
        liste_mots=list(set(liste_mots))
        return liste_mots
     
    def recherche_complement(saisie,liste_mots):
        """La variable saisie correspond au début du mot à* compléter éventuellement;
     
        liste_mots est la liste de l'ensemble de tous les mots susceptibles d'être complétés
       
        En retour: liste_complement qui est la liste triée dans l'ordre croissant des mots trouvés
        dans liste_mots qui commencent par la variable affectée à saisie"""
     
        liste_complement=[]
        for mots in liste_mots:
            if mots.startswith(saisie):
                liste_complement.append(mots)
        numero_index=1
        while numero_index<len(liste_complement):
            numero_test=numero_index-1
            while liste_complement[numero_test]>liste_complement[numero_index] and numero_test>=0:
                numero_test=numero_test-1
            if numero_test<numero_index-1:
                tampon=liste_complement[numero_index]
                j=numero_index
                while j>numero_test+1:
                    liste_complement[j]=liste_complement[j-1]
                    j=j-1
                liste_complement[numero_test+1]=tampon    
            numero_index=numero_index+1
        return liste_complement
     
     
    def interface(mot):
        fen_compl=tkinter.Tk()
        fen_compl.title("Principale")
        cadre=tkinter.Frame(fen_compl)
        cadre.pack()
        ascenseur=tkinter.Scrollbar(cadre,orient=tkinter.VERTICAL)
        ascenseur.pack(side=tkinter.RIGHT,fill=tkinter.Y)
        liste_proposition=tkinter.Listbox(cadre,yscrollcommand=ascenseur.set)
        ascenseur.config(command=liste_proposition.yview)
        liste_proposition.pack(fill=tkinter.Y)
        liste_mots_initiale=mots_pour_complements()
        liste_gen=recherche_complement(mot,liste_mots_initiale)
        liste_proposition.delete(0,tkinter.END)
        for mot_select in liste_gen:
            liste_proposition.insert(tkinter.END,mot_select)
        liste_proposition.selection_set(0,0)
        bouton=tkinter.Button(fen_compl,text='Quitter',command=fen_compl.destroy)
        bouton.pack(side=tkinter.BOTTOM)
        fen_compl.wm_attributes("-topmost", 1, "-alpha", 0.75)
        fen_compl.overrideredirect(1)
        fen_compl.mainloop()
     
    def OnKeyboardEvent(touche):
        f=open(r'c:\mot.txt','r')
        syntaxe=f.read()
        f.close()
        f=open(r'c:\mot.txt','w')        
        if touche.Ascii==32:
            print syntaxe
            f.write('')
        elif touche.Key=="Down":
            selection()
        elif touche.Ascii!=0:
            syntaxe+=chr(touche.Ascii)
            f.write(syntaxe)
            interface(syntaxe)
        f.close()
        return True
     
    def selection():
        fen_compl.liste_proposition.focus_set()
     
    if __name__ == '__main__':
        f=open(r'c:\mot.txt','w')
        f.write('')
        f.close()
        hm = pyHook.HookManager()
        hm.KeyDown=OnKeyboardEvent
        hm.HookKeyboard()
        pythoncom.PumpMessages()
    Merci pour vos réponses si vous voyez des possibilités d'amélioration.

    Gabriel

  15. #15
    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
    Citation Envoyé par Ruyneau Voir le message
    Plusieurs problèmes apparaissent dans le code ci-dessous:
    [LIST=1][*]lorsque je clique sur le bouton <<quitter>> de la fenetre le <<hook>> continue à tourner alors que je souhaiterais arreter définitivement le programme
    C'est bien de cela dont je vous parle: Vous avez deux 'boucles': mainloop() et PumpMessages(). Vous devez utiliser win32 pour envoyer un WM_QUIT.
    Citation Envoyé par Ruyneau Voir le message
    L'appel de la fonction selection ne fonctionne pas; il y a certainement un problème de transfert de variable mais là je ne connais pas la syntaxe pout dire qu'il s'agit de la fenetre fen_compl
    Pour selection fen_compl n'existe effectivement pas.
    Pour le moment vous pouvez utiliser global.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def interface(mot):
        global fen_compl
        fen_compl=tkinter.Tk()
    @+

  16. #16
    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
    Citation Envoyé par PauseKawa Voir le message
    C'est bien de cela dont je vous parle: Vous avez deux 'boucles': mainloop() et PumpMessages(). Vous devez utiliser win32 pour envoyer un WM_QUIT.
    Pour ce qui est de quitter PumpMessages() le code exemple suivant devrait (non testé) fonctionner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import win32api, win32con, pythoncom
     
    def callback(event):
        if event.Key == 'q':
            win32api.PostThreadMessage(threadid, win32con.WM_QUIT, 0, 0)
        else:
            print(event.Key)
     
    threadid = win32api.GetCurrentThreadId()
    hm = pyHook.HookManager()
    hm.KeyDown = callback
    hm.HookKeyboard()
    pythoncom.PumpMessages()
    @+

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Par défaut
    Bonjour,

    J'ai testé le code suivant qui correspond au dernier de Pausekawa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import win32api, win32con, pythoncom, pyHook
     
    def callback(event):
        if event.Key == 'Q':
            win32api.PostThreadMessage(threadid, win32con.WM_QUIT, 0, 0)
        else:
            print(event.Key)
     
    threadid = win32api.GetCurrentThreadId()
    hm = pyHook.HookManager()
    hm.KeyDown = callback
    hm.HookKeyboard()
    pythoncom.PumpMessages()
    Si je commence par taper <<q>> pas de souci, le <<pompage>> s'arrete par contre si je tape <<azq>> alors il met un message d'erreur spécifiant qu'un entier?

    Par ailleurs pour ma gestion de saisie simultanée entre ce qui est tapé dans l'éditeur de texte (reconnu par pyHook) et la correspondance dans ma fenetre est-ce que j'ai intéret à insérer cette fenetre à l'intérieur d'un thread et de gérer ce thread comme a été géré celui au dessus?

    Merci pour vos réponses.

    Gabriel

    PS: Meme en faisant la déclaration <<global>> dans <<fen_compl>> je n'ai pas réussi à faire le transfert vert la fonction <<selection>>

  18. #18
    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
    Citation Envoyé par Ruyneau Voir le message
    Si je commence par taper <<q>> pas de souci, le <<pompage>> s'arrete par contre si je tape <<azq>> alors il met un message d'erreur spécifiant qu'un entier?
    Le message est ?

    Citation Envoyé par Ruyneau Voir le message
    PS: Meme en faisant la déclaration <<global>> dans <<fen_compl>> je n'ai pas réussi à faire le transfert vert la fonction <<selection>>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def interface(mot):
        global fen_compl
        global liste_proposition
    ...
    def selection():
        liste_proposition.focus_set()
    Mais je suis quasiment sur, dans la présentation actuelle du code, que la fonction selection vas planter .PumpMessages().

    Citation Envoyé par Ruyneau Voir le message
    Par ailleurs pour ma gestion de saisie simultanée entre ce qui est tapé dans l'éditeur de texte (reconnu par pyHook) et la correspondance dans ma fenetre est-ce que j'ai intéret à insérer cette fenetre à l'intérieur d'un thread et de gérer ce thread comme a été géré celui au dessus?
    Plutôt une classe comme montrer. Nous avons déjà deux threads (mainloop et PumpMessages), c'est suffisant

    @+

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Par défaut
    Bonsoir,

    Le message d'erreur est le suivant :
    Traceback (most recent call last):
    File "C:\Python27\lib\site-packages\pyHook\HookManager.py", line 351, in KeyboardSwitch
    return func(event)
    File "C:\Gabriel\Outils\Moteur\pyhook06.py", line 5, in callback
    win32api.PostThreadMessage(threadid, win32con.WM_QUIT, 0, 0)
    TypeError: an integer is required
    Donc, va falloir que je me plonge sur la notion de class...

    Je vais essayer de modifier l'appel de selection.

    Merci (encore)

    Gabriel

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

    En toute franchise je ne vois pas d’où cela viens. La seule différence que je vois se trouve dans les imports.
    A la limite vous pouvez faire un print(threadid, type(threadid)) juste après threadid = win32api.GetCurrentThreadId() mais je me doute du résultat.

    @+

    Ps: Bonne fêtes @ll

Discussions similaires

  1. Ecrire dans deux fichiers différent
    Par Diablo_22 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 09/08/2007, 17h11
  2. [IOException] Ecriture dans deux fichiers différents
    Par arkheron dans le forum Langage
    Réponses: 3
    Dernier message: 04/06/2007, 13h00
  3. Faire apparaitre un DIV dans une zone différente
    Par ThomasH dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 23/10/2006, 15h45
  4. [Conception] Inscription simultanée sur deux sites différents
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 20/04/2006, 11h28

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