Auto-complétion à partir d'une liste Python

Résolu
john_debutant -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour, je suis actuellement bloqué sur un projet, je souhaiterais utiliser une interface avec le module tkinter et utiliser une entry qui lorsque l'on écrit dedans, pré suggère les mots qui correspondent aux premières lettres entrées à partir d'une liste dans le programme

Je me suis inspiré des sites comme : https://askcodez.com/comment-lauto-completion-de-code-python.html
https://stackoverflow.com/questions/7821661/how-to-write-code-to-autocomplete-words-and-sentences?answertab=modifieddesc#tab-top
mais je n'arrive pas a l'adapter à ma recherche sous Python 3.10.4

code :
from pyreadline3 import Readline
readline = Readline()
import tkinter

acceuil = tkinter.Tk()
acceuil.title("Acceuil")
acceuil.config(bg="#FFFFFF")
acceuil.geometry("1080x720")
acceuil.maxsize(1080,720)
acceuil.minsize(480,360)

class MyCompleter(object):  # Custom completer

    def __init__(self, options):
        self.options = sorted(options)

    def complete(self, text, state):
        if state == 0 :  # on first trigger, build possible matches
            if text :  # cache matches (entries that start with entered text)
                self.matches = [s for s in self.options if s and tkinter.S.startswith(text)]
            else:  # no text entered, all matches possible
                self.matches = self.options[:]

        # return match indexed by state
        try : 
            return self.matches[state]
        except IndexError:
            return None

completer = MyCompleter(["Bonjour","nous","sommes","des","mots","test"])
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')

selecteur2 = tkinter.Entry(acceuil, width = 30, bd = 5, font = "Arial", justify = "center", background = "green", text = readline.set_completer(completer.complete) )
selecteur2.place(x = 20, y = 100)
acceuil.mainloop()


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.



Configuration: Windows / Chrome 101.0.4951.54
A voir également:

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
ne devrais-tu pas commencer par faire un code tkinter qui fonctionne, pui sl'adapter?
0
john_debutant
 
Bonjour, j'ai déjà un code tkinter fonctionnel, je l'ai simplifié dans l'exemple pour limité les contraintes et ciblé précisément le problème avec les outils que j'utilise.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > john_debutant
 
Partage un code tkinter simplifié fonctionnel, un code pyreadline3 simplifié fonctionnel, et ensuite un code intégrant les deux.
Explique aussi ce que tu veux précisément réaliser.
0
john_debutant > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Code tkinter :
import tkinter

acceuil = tkinter.Tk()
acceuil.title("Acceuil")
acceuil.config(bg="#FFFFFF")
acceuil.geometry("1080x720")
acceuil.maxsize(1080,720)
acceuil.minsize(480,360)

selecteur2 = tkinter.Entry(acceuil, width = 30, bd = 5, font = "Arial", justify = "center", background = "green", text = "readline.set_completer(completer.complete)" )
selecteur2.place(x = 20, y = 100)
acceuil.mainloop()


Code pyreadline3 :
from pyreadline3 import Readline
readline = Readline()

class MyCompleter(object):  # Custom completer

    def __init__(self, options):
        self.options = sorted(options)

    def complete(self, text, state):
        if state == 0:  # on first trigger, build possible matches
            if text:  # cache matches (entries that start with entered text)
                self.matches = [s for s in self.options 
                                    if s and s.startswith(text)]
            else:  # no text entered, all matches possible
                self.matches = self.options[:]

        # return match indexed by state
        try: 
            return self.matches[state]
        except IndexError:
            return None

completer = MyCompleter(["hello", "hi", "how are you", "goodbye", "great"])
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')

input = raw_input("Input: ")
print("You entered", input)


Le code que j'ai essayé en intégrant les 2 est le premier publié.

Mon objectif est de pouvoir (à partir d'une liste de différents mots fournis dans le code) de pouvoir écrire 1 lettre/chiffre dans le
tk.Entry
et que le programme suggère les différents mots complets qui commence par cette même lettre/chiffre à la façon d'une auto-complétion, et qu'en appuyant sur une touche donnée, le mot s'écrive au complet.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > john_debutant
 
ton code tkinter ne réagit pas quand on y entre du texte.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > john_debutant
 
peux-tu utiliser les balises de code (et spécifier python) quand tu partages du code? comme tu le vois, ton code est illisible et il y manque l'indentation, indispensable.
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Bonjour,

Le problème avec pyreadline3, ça ne marche pas sous Linux, donc personnellement je ne peux pas tester ce que tu as fait. Donc peux-tu plutôt repartir de cet exemple après avoir installé
ttkwidgets
, qui lui fonctionne correctement ? Pour installer le module en question :
  • Sous Windows :

pip install ttkwidgets
  • Sous Linux (Ubuntu, Debian) :

sudo apt update
sudo apt install python3-pip
sudo pip3 install ttkwidgets


Bonne chance
0
john_debutant
 
Je me suis inspiré de ton exemple et cela marche parfaitement sur windows, merci beaucoup de ton aide et d'avoir trouvé le bon site !
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882 > john_debutant
 
Merci pour ton retour et bonne continuation :-)
0