Récupérer du texte à partir d'un champ de saisie sur tkinter

Résolu/Fermé
manyonne Messages postés 4 Date d'inscription dimanche 3 octobre 2021 Statut Membre Dernière intervention 5 janvier 2022 - Modifié le 13 janv. 2022 à 17:43
mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 - 13 janv. 2022 à 17:57
Bonjour,

Ce problème n'est pas sans solution sur internet, qui exigent la création d'une nouvelle classe. Cependant, je ne peux pas le faire à cause d'une contrainte.
J'ai passé beaucoup de temps à essayer différentes solutions, mais malheureusement je suis bloqué.
je vous fourni le code ainsi que son résultat.
En espérant que quelqu'un pourra m'aider.
(le temps me fait défaut et donc je m'en remets à vous)




Configuration: Windows / Opera 82.0.4227.50

1 réponse

mamiemando Messages postés 33088 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 30 avril 2024 7 750
Modifié le 13 janv. 2022 à 18:00
Bonjour,

Merci de copier coller ton texte en le mettant en forme avec les balises de code plutôt que d'utiliser une capture d'écran, ce sera plus pratique pour tout le monde et plus écologique.

Explication rapide

Tu confonds dans ton code deux étapes :
  • celle où tu places les éléments dans ta fenêtre (par exemple, les champs texte, les boutons...)
  • et celle où tu traites les données saisies (suite à un événement, par exemple, quand tu cliques sur un bouton ou quand tu appuies sur une touche de clavier).


Explication détaillée

Généralement, on aura effectivement à faire une classe pour une fenêtre, et cet objet contient les éléments contenus dans cette fenêtre, mais ça n'est pas obligatoire.

L'exemple "calculator" proposé dans ce lien montre comment faire :

#!/usr/bin/env python3

import tkinter as tk
from math import *

def evaluate(event):
    res.configure(text = "Result: " + str(eval(entry.get())))
    
w = tk.Tk()
tk.Label(w, text="Your Expression:").pack()
entry = tk.Entry(w)
entry.bind("<Return>", evaluate)
entry.pack()
res = tk.Label(w)
res.pack()
w.mainloop()


Que fait ce programme ?
  • On commence par créer une fenêtre
    w
    , dans laquelle on installe un texte (
    tk.Label
    ) et un champ (
    tk.Entry
    ) pour saisir une valeur.
  • Ensuite, à l'aide de la méthode
    bind
    , on indique que la fonction
    evaluate
    doit être appelée à chaque fois que l'utilisateur appuie sur la touche Entrée.
  • Puis on crée dans
    w
    un champ texte
    res
    dont le contenu sera corrigé par la fonction
    evaluate
    . La fonction
    evaluate
    est appelée callback, car elle est passée en paramètre d'une autre fonction (en l'occurrence,
    bind
    ).
  • Enfin, Une fois que le comportement complet de la fenêtre est spécifié, on lance le programme a proprement parler avec
    w.mainloop()
    .


Note que toutes ces variables sont déclarées en dehors d'une classe, ce qui montre bien que ça n'est pas indispensable (même si je ne vois pas trop pourquoi tu ne pourrais pas utiliser une classe dans ton cas, mais peu importe).

Tu vois donc que la déclaration de la fenêtre à proprement parler (le programme principal) et le traitement qui est fait (la callback
evaluate
) sont donc séparés. Cette distinction est incontournable, et comme elle n'est pas faite dans le bout de code que tu as partagé, c'est pour cela que ce dernier ne marche pas.

Bonne chance
0