Bonjour,
Je cherche à faire un programme d'autocompletion en python qui puisse être activé dans plusieurs traitements textes.
Pour l'instant, je suis arrivé au résultat ci-dessous (je ne connais pas grand chose à Pyhton et je ne suis pas programmateur...)
J'arrive à faire une autocompletion lorsque le texte est saisi à l'intérieur d'un widget de type tkinter.Entry. Je souhaiterais que cette autocompletion puisse se faire directement sur n'importe quel document ouvert par un logiciel de traitement de texte.
Existe-t-il un code pour rendre actif un programme python dans une autre application?
Comment fait-on pour récupérer le texte du document actif pour pouvoir faire l'autocompletion ?
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
 
 
import os
import re
import shutil
import tkinter
 
def mots_pour_complements():
    """Liste des mots susceptibles d'être complétés"""
 
    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 selection(inutile):
    """Si l'utilisateur tape <'Down'> on positionne le focus sur la liste des mots"""    
    liste.focus_set()
 
def separation():
    """Fonction qui permet de récupérer le dernier <<mot>> qui est entrain d'être saisi"""
 
    phrase=zone_saisie.get()
    decoupage=phrase.split(' ')
    mot=decoupage[-1]
    decoupage=mot.split('\\')
    mot=decoupage[-1]
    return phrase,mot
 
def recuperation(inutile):
    """Fonction qui permet l'affichage dans la liste des propositions de complément"""
 
    [phrase,mot]=separation()
    liste_mots=mots_pour_complements()
    liste_complement=recherche_complement(mot,liste_mots)
    liste.delete(0,tkinter.END)
    if phrase[-1:]!=r' ':
        for mot_select in liste_complement:
            liste.insert(tkinter.END,mot_select)
        liste.selection_set(0,0)
 
def affiche(inutile):
    """Fonction qui complète après sélection le mot en cours de frappe"""
 
    [phrase,mot]=separation()
    phrase_sans_mot=phrase[:-len(mot)]
    zone_saisie.delete(0,tkinter.END)
    zone_saisie.insert(tkinter.END,phrase_sans_mot+liste.get(liste.curselection()))
    zone_saisie.focus_set()
    liste.delete(0,tkinter.END)
 
 
 
#Début du corps du programme    
 
#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()
zone_saisie.focus_set()
 
#Création de <<cadre>> de type Frame pour regrouper la liste avec un ascenseur
cadre=tkinter.Frame(racine)
cadre.pack()
 
#Création de <<ascenseur>> de type Scrollbar et de <<liste>> de type Listbox
#pour afficher la proposition des mots pour le complément
ascenseur=tkinter.Scrollbar(cadre,orient=tkinter.VERTICAL)
ascenseur.pack(side=tkinter.RIGHT,fill=tkinter.Y)
liste=tkinter.Listbox(cadre,yscrollcommand=ascenseur.set)
ascenseur.config(command=liste.yview)
liste.pack(fill=tkinter.Y)
 
#Exécution évenementiels en fonction des touches tapées sur le clavier
#La touche Return affiche le résultat
#La touche Down permet de sélectionner la liste
liste.bind('<Return>',affiche)
 
zone_saisie.bind('a',recuperation)
zone_saisie.bind('b',recuperation)
zone_saisie.bind('c',recuperation)
zone_saisie.bind('d',recuperation)
zone_saisie.bind('e',recuperation)
zone_saisie.bind('f',recuperation)
zone_saisie.bind('g',recuperation)
zone_saisie.bind('h',recuperation)
zone_saisie.bind('i',recuperation)
zone_saisie.bind('j',recuperation)
zone_saisie.bind('k',recuperation)
zone_saisie.bind('l',recuperation)
zone_saisie.bind('m',recuperation)
zone_saisie.bind('n',recuperation)
zone_saisie.bind('o',recuperation)
zone_saisie.bind('p',recuperation)
zone_saisie.bind('q',recuperation)
zone_saisie.bind('r',recuperation)
zone_saisie.bind('s',recuperation)
zone_saisie.bind('t',recuperation)
zone_saisie.bind('u',recuperation)
zone_saisie.bind('v',recuperation)
zone_saisie.bind('w',recuperation)
zone_saisie.bind('x',recuperation)
zone_saisie.bind('y',recuperation)
zone_saisie.bind('z',recuperation)
zone_saisie.bind('é',recuperation)
zone_saisie.bind('è',recuperation)
zone_saisie.bind('A',recuperation)
zone_saisie.bind('B',recuperation)
zone_saisie.bind('C',recuperation)
zone_saisie.bind('D',recuperation)
zone_saisie.bind('E',recuperation)
zone_saisie.bind('F',recuperation)
zone_saisie.bind('G',recuperation)
zone_saisie.bind('H',recuperation)
zone_saisie.bind('I',recuperation)
zone_saisie.bind('J',recuperation)
zone_saisie.bind('K',recuperation)
zone_saisie.bind('L',recuperation)
zone_saisie.bind('M',recuperation)
zone_saisie.bind('N',recuperation)
zone_saisie.bind('O',recuperation)
zone_saisie.bind('P',recuperation)
zone_saisie.bind('Q',recuperation)
zone_saisie.bind('R',recuperation)
zone_saisie.bind('S',recuperation)
zone_saisie.bind('T',recuperation)
zone_saisie.bind('U',recuperation)
zone_saisie.bind('V',recuperation)
zone_saisie.bind('W',recuperation)
zone_saisie.bind('X',recuperation)
zone_saisie.bind('Y',recuperation)
zone_saisie.bind('Z',recuperation)
zone_saisie.bind('<Down>',selection)
zone_saisie.bind('<Return>',affiche)
 
#Affichage du tout
racine.mainloop()
Merci pour vos réponses.

Gabriel

PS pour le modérateur (j'ai mis ce postit dans la rubrique EDT (développement) et je me suis rendu compte que je ne devais pas être dans le bon forum...