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

Résolu/Fermé
john_debutant - Modifié le 9 mai 2022 à 10:59
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 12 mai 2022 à 11:13
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

2 réponses

yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476
9 mai 2022 à 12:13
bonjour,
ne devrais-tu pas commencer par faire un code tkinter qui fonctionne, pui sl'adapter?
0
john_debutant
9 mai 2022 à 12:34
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 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > john_debutant
9 mai 2022 à 12:42
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 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024
Modifié le 10 mai 2022 à 18:10
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 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > john_debutant
9 mai 2022 à 14:25
ton code tkinter ne réagit pas quand on y entre du texte.
0
yg_be Messages postés 22724 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 avril 2024 1 476 > john_debutant
9 mai 2022 à 14:26
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié le 10 mai 2022 à 18:18
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
11 mai 2022 à 08:47
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 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749 > john_debutant
12 mai 2022 à 11:13
Merci pour ton retour et bonne continuation :-)
0