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. #21
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Points : 64
    Points
    64
    Par défaut Dernière mouture et joyeuses fêtes
    Bonjour,

    Je verrais plus tard ce problème de suppression du Hook.

    J'ai donc essayé de faire des class
    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
    101
    102
    103
    104
    105
    106
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    #
    #
    import Tkinter
    import pyHook
    import pythoncom
    import win32api, win32con
     
    class Master():
        def __init__(self):
            """ Initialisation du Hook """
            self.hm = pyHook.HookManager()
            self.hm.KeyDown = self.on_event
            self.hm.HookKeyboard()        
            pythoncom.PumpMessages()        
     
        def presentation_fenetre(self):
            self.liste_choix=self.recherche_complements()
            self.fenetre_compl = Interface()
            self.fenetre_compl.liste_proposition.delete(0,Tkinter.END)
            for mot_select in self.liste_choix:
                self.fenetre_compl.liste_proposition.insert(Tkinter.END,mot_select)
            self.fenetre_compl.liste_proposition.selection_set(0,0)
            self.fenetre_compl.mainloop()
    #       Affichage de la fenêtre uniquement        
     
        def selection_fenetre(self):
            self.liste_choix=self.recherche_complements()
            self.fenetre_compl = Interface()
            self.fenetre_compl.liste_proposition.delete(0,Tkinter.END)
            for mot_select in self.liste_choix:
                self.fenetre_compl.liste_proposition.insert(Tkinter.END,mot_select)
            self.fenetre_compl.liste_proposition.selection_set(0,0)
            self.fenetre_compl.mainloop()
    #       Annuler le pyHook
     
        def on_event(self, event):
            f=open(r'c:\mot.txt','r')
            syntaxe=f.read()
            f.close()
            f=open(r'c:\mot.txt','w')        
            if event.Ascii==32:
                print syntaxe
                f.write('')
                f.close()            
            elif event.Key=="Down":
                self.selection_fenetre()
            elif event.Ascii!=0:
                syntaxe+=chr(event.Ascii)
                f.write(syntaxe)
                f.close()
                self.presentation_fenetre()
            return True
     
        def recherche_complements(self):
            """ création de la liste des mots pour le complément"""
    #Liste_mots 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))
            liste_complement=[]
            f=open(r'c:\mot.txt','r')
            saisie=f.read()
            f.close()
            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
     
     
     
    class Interface(Tkinter.Tk):
        def __init__(self):
            """ Création de la fenêtre """
            Tkinter.Tk.__init__(self)
            self.title(" ")
            self.cadre=Tkinter.Frame(self)
            self.cadre.pack()
            self.liste_proposition=Tkinter.Listbox(self.cadre,height=4)
            self.liste_proposition.pack(fill=Tkinter.Y)
     
        def on_exit(self):
            self.destroy()
     
     
    if __name__ == '__main__':
        f=open(r'c:\mot.txt','w')
        f.write('')
        f.close()
        Master()
    J'ai fait deux fonctions - qui ne marchent pas encore - def selection_fenetre(self) dont l'objectif est de rendre actif la fenêtre (donc annulation du pyHook) et def presentation_fenetre(self): dont l'affichage évolue en fonction de la saisie sur le traitement de texte mais la fenêtre n'est pas <<active>>

    Bonnes fêtes et encore merci.

    Gabriel

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

    Citation Envoyé par Ruyneau Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Master():
        def __init__(self):
            """ Initialisation du Hook """
            self.hm = pyHook.HookManager()
            self.hm.KeyDown = self.on_event
            self.hm.HookKeyboard()        
            pythoncom.PumpMessages()
    Citation Envoyé par PauseKawa Voir le message
    Plutôt une classe comme montrer. Nous avons déjà deux threads (mainloop et PumpMessages), c'est suffisant
    Je n'ai rien dit: pythoncom.PumpMessages() est bloquant (et dire que je le rabâche depuis le début...). Il est donc préférable de le lancer dans le run() d'un thread pour ne pas bloquer l'interpréteur.
    Le principe est de mettre dans l'__init__ de celui-ci le self.threadid = win32api.GetCurrentThreadId() (et tout le self.hm = pyHook.HookManager()...) et dans une fonction (dans l'exemple 'stop') le win32api.PostThreadMessage(self.threadid, win32con.WM_QUIT, 0, 0).

    Promis: Si j'ai le temps a mon retour au taf (comité restreint... Vacances oblige) je teste sur une machine Windows.

    @+ et bon courage dans votre découverte des classes.

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Points : 64
    Points
    64
    Par défaut fin du pyHook
    Bonjour,

    Pour fermer le pyHook, il fallait rajouter un
    return True
    à la fin de la déclaration de fonction. Le code devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import win32api, win32con, pythoncom, pyHook
     
    def callback(event):
        if event.Key == 'Q':
            win32api.PostThreadMessage(threadid, win32con.WM_QUIT, 0, 0)
        else:
            print(event.Key)
        return True
     
    threadid = win32api.GetCurrentThreadId()
    hm = pyHook.HookManager()
    hm.KeyDown = callback
    hm.HookKeyboard()
    pythoncom.PumpMessages()
    Gabriel

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Points : 64
    Points
    64
    Par défaut Des classes ont été créées mais...
    Bonjour,

    J'ai donc essayé de créer des classes - il y en a 4 -
    J'arrive donc au programme ci-dessous.

    Pour l'instant, c'est la touche <'Down'> qui permet (en théorie) d'ouvrir la fenêtre de complementation.

    Les difficultés rencontrées pour l'instant sont les suivantes:
    1. Tout d'abord la touche <'Down'> est opérante uniquement lorsque je commence par toucher la touche 'Down'. Si je tape 'c' puis touche 'Down', çà ne marche pas...
    2. lorsque la fenêtre s'affiche, je n'arrive pas à l'activer... je souhaiterais que lorsqu'on tape les touches '<Down>' et '<Up>' la selection se déplace sur la liste des choix. C'est certainement du au pyHook qui reste encore actif et que je n'arrive pas à stopper temporairement (pb de gestion de thread)
    3. le boutton <'Quitter'> ne fonctionne pas


    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
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    #
    #
    import Tkinter
    import pyHook
    import pythoncom
    import win32api, win32con
    import threading
    import time
    import sys
     
    class Clavier(threading.Thread):
     
        def __init__(self):
            threading.Thread.__init__(self)
            self.run()
     
        def run(self):
            """ Initialisation du Hook """
            self.threadidph = win32api.GetCurrentThreadId()
            self.hm = pyHook.HookManager()
            self.hm.KeyDown = self.on_event
            self.hm.HookKeyboard()        
            pythoncom.PumpMessages()
     
        def stop(self):
            win32api.PostThreadMessage(self.threadidph, win32con.WM_QUIT, 0, 0)
     
        def on_event(self, event):
            f=open(r'c:\mot.txt','r')
            syntaxe=f.read()
            f.close()
            if event.Ascii==32:
                print syntaxe
                f=open(r'c:\mot.txt','w')
                f.write('')
                f.close()
            elif event.Key=="Escape":
                print "Arreter le pyHook"
                self.stop()
            elif event.Key=="Down":
                self.appel_fenetre()
            elif event.Ascii!=0:
                syntaxe+=chr(event.Ascii)
                f=open(r'c:\mot.txt','w')
                f.write(syntaxe)
                f.close()            
            return True
     
        def appel_fenetre(self):
            self.af=Interface()
            self.af.run()
            self.af.affichage()
     
     
    class Interface(threading.Thread):
     
        def __init__(self):
            threading.Thread.__init__(self)
            self.run()
     
        def run(self):
            self.threadidaf = win32api.GetCurrentThreadId()
     
        def selection(self):
            self.selection_set(0,0)
     
        def affichage(self):
            self.fenetre_compl=Fenetre()
            self.liste_choix=self.recherche_complements()
            self.fenetre_compl.liste_proposition.delete(0,Tkinter.END)
            for mot_select in self.liste_choix:
                self.fenetre_compl.liste_proposition.insert(Tkinter.END,mot_select)
            self.fenetre_compl.liste_proposition.bind('Down',self.selection)
            self.fenetre_compl.mainloop()
     
    #    def activation_fenetre(self):
     
        def recherche_complements(self):
            """ création de la liste des mots pour le complément"""
    #Liste_mots 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))
            liste_complement=[]
            f=open(r'c:\mot.txt','r')
            saisie=f.read()
            f.close()
            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
     
     
    class Fenetre(Tkinter.Tk):
        def __init__(self):
            """ Création de la fenêtre """
            Tkinter.Tk.__init__(self)
            self.title("Compléments")
            self.cadre=Tkinter.Frame(self)
            self.cadre.pack()
            self.liste_proposition=Tkinter.Listbox(self.cadre,height=4)
            self.liste_proposition.pack(fill=Tkinter.Y)
            self.bouton_fin = Tkinter.Button(self.cadre, text = 'Quitter', command = self.quitter)
            self.bouton_fin.pack()
     
        def quitter(self):
            self.sys.exit()
     
    class Master():
     
        def __init__(self):
            pH=Clavier()
            pH.run()        
     
     
    if __name__ == '__main__':
        f=open(r'c:\mot.txt','w')
        f.write('')
        f.close()
        Master()
    Si vous avez des idées... merci.

    Bonne année.

    Gabriel

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Points : 64
    Points
    64
    Par défaut des progrès mais ce n'est pas encore çà
    Bonjour,

    Je suis revenu sur le thème initial (saisie simultanée).

    J'arrive à faire afficher dans la fenetre Tkinter le texte qui est saisi dans l'éditeur. Mais si je tape trop vite le texte, certaines lettres ne sont pas prises en compte par le Hook à cause du temps de l'affichage de la fenêtre.

    Serait-il possible de palier ce problème.

    Merci pour vos réponses.

    Gabriel

    Ci-dessous 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
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    #
    #
    import threading
    import time
    import pyHook, win32api, win32con, pythoncom
    import Tkinter
     
    class Interface(Tkinter.Tk):
        def __init__(self,titre_label):
            Tkinter.Tk.__init__(self)
            self.titre_label=titre_label
            self.overrideredirect(1)
            self.wm_attributes("-topmost", 1, "-alpha", 1)        
            self.title("Message")
            self.capture = Tkinter.Label(self,text=self.titre_label)
            self.capture.pack()
            btn = Tkinter.Button(self, text = 'Quitter',command=self.on_exit)
            btn.pack()
     
     
        def on_exit(self):
            self.destroy()
     
    class Affichage(threading.Thread):
     
        def __init__(self,nom):
            threading.Thread.__init__ (self, target=self.run)
            self.nom=nom
     
        def run (self):
            self.nom.mainloop()
     
        def stop(self):
            self.nom.destroy()
     
     
    class Recuperation():
     
        def __init__(self):
            self.Terminated = False
            self.mot=''
     
        def run(self):
            while not self.Terminated:
                self.run_pyHook()
     
        def stop(self):
            self.Terminated = True
            print "terminé"
     
        def run_pyHook(self):
            self.threadidCl = win32api.GetCurrentThreadId()
            self.hm = pyHook.HookManager()
            self.hm.KeyDown = self.on_event
            self.hm.HookKeyboard()        
            pythoncom.PumpMessages()
     
        def stop_pyHook(self):
            win32api.PostThreadMessage(self.threadidCl, win32con.WM_QUIT, 0, 0)
     
        def on_event(self, event):
     
            if event.Ascii==32:
                self.mot=''
            elif event.Key=="Escape":
                print "Arreter le tout"
                self.stop()
            elif event.Ascii!=0:
                self.mot=self.mot+chr(event.Ascii)
     
            self.stop_pyHook()
            time.sleep(0.5)
            truc=Interface(self.mot)
            Thread1 = Affichage(truc)
            Thread1.start()
            time.sleep(1)
            Thread1.stop()
     
            return True
     
    class Master():
     
        def __init__(self):
            a=Recuperation()
            a.run()
     
    if __name__ == '__main__':
        Master()

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 147
    Points : 64
    Points
    64
    Par défaut No news?
    J'ai essayé en mettant le Hook (Recuperation) dans un thread mais je me heurte à la m^^eme difficulté. Dois-je conclure qu'il est impossible de saisir un texte sur la feuille d'un éditeur, de récupérer le mot saisi par l'utilisateur (via le Hook) et d'afficher <<simultanément>> le mot saisi dans une fen^^etre?

    Gabriel

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, 16h11
  2. [IOException] Ecriture dans deux fichiers différents
    Par arkheron dans le forum Langage
    Réponses: 3
    Dernier message: 04/06/2007, 12h00
  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, 14h45
  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, 10h28

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