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 :

blocage au niveau des saisies


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2020
    Messages : 67
    Points : 32
    Points
    32
    Par défaut blocage au niveau des saisies
    bonjour,

    j'ai développé ce bout de code dans lequel j'utilise des entry que je teste mon code marche bien si je ne dépasse pas 7 voir 8 entry mais dés que

    je passe à 10 et plus il réagit plus alors que je dois saisir 50 entry
    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
     
    est ce que vous pouvez me dire pourquoi
     
    from tkinter import *
    fenetre = Tk()
    fenetre.geometry("550x550")
     
    ZonneVariable=[[53, 53], [53, 153], [53, 203], [53, 303], [53, 353], [53, 403], [53, 453],[103, 53], [103, 153],\
                    [103, 203], [103, 253], [103, 303], [103, 353], [103, 453],\
                   [153, 53], [153, 203], [153, 253], [153, 303], [153, 353], \
                   [203, 153], [203, 203], [203, 303], [203, 453],\
                   [253, 53], [253, 103], [253, 153], [253, 253], [253, 453], \
                   [303, 103],  [303, 203],  [303, 303], [303, 353], [303, 403],\
                   [353, 203], [353, 303], [353, 353], [353, 403], [353, 453],\
                   [403, 103], [403, 153], [403, 203], [403, 253], [403, 353], [403, 403],\
                   [453, 53], [453, 103], [453, 153], [453, 253], [453, 353], [453, 403]]
     
    NB_ENTRY=50# NOMBRE DE ZONES DE SAISIE
     
     
    Saisie_Utilisateur = ['' for i in range(NB_ENTRY)] #LISTE POUR LES DONNEES SAISIE PAR L'UTILISATEUR
     
    def verification(*args):
     
      for i in range(NB_ENTRY):
       value = Saisie_Utilisateur[i].get()
       if value.isdigit() and int(value)!=0:
     
          if len(value) > 1:
             Saisie_Utilisateur[i].set(value[:1])
       else:
          Saisie_Utilisateur[i].set('')
     
     
    for i in range(NB_ENTRY):
       Saisie_Utilisateur[i] = StringVar()
       Saisie_Utilisateur[i].trace("w", verification)
       Entry(fenetre,font=("Purisa",25),bg="yellow",justify="center", textvariable=Saisie_Utilisateur[i]).place(x=ZonneVariable[i][1],y=ZonneVariable[i][0], height=45, width=45)
     
    fenetre.mainloop()
    merci d'avance

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    J'ai donné la réponse sur un autre forum

    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
    import refrom tkinter import *
     
    fenetre = Tk()
    fenetre.geometry("550x550")
     
    ZonneVariable = [[53, 53], [53, 153], [53, 203], [53, 303], [53, 353], [53, 403], [53, 453], [103, 53], [103, 153], \
                     [103, 203], [103, 253], [103, 303], [103, 353], [103, 453], \
                     [153, 53], [153, 203], [153, 253], [153, 303], [153, 353], \
                     [203, 153], [203, 203], [203, 303], [203, 453], \
                     [253, 53], [253, 103], [253, 153], [253, 253], [253, 453], \
                     [303, 103], [303, 203], [303, 303], [303, 353], [303, 403], \
                     [353, 203], [353, 303], [353, 353], [353, 403], [353, 453], \
                     [403, 103], [403, 153], [403, 203], [403, 253], [403, 353], [403, 403], \
                     [453, 53], [453, 103], [453, 153], [453, 253], [453, 353], [453, 403]]
     
    NB_ENTRY = 50  # NOMBRE DE ZONES DE SAISIE
     
    Saisie_Utilisateur = ['' for i in range(NB_ENTRY)]  # LISTE POUR LES DONNEES SAISIE PAR L'UTILISATEUR
     
     
    def verification(*args):
        zone = args[0]
        n_zone = int(re.search("\d+", zone).group(0))
        value = Saisie_Utilisateur[n_zone].get()
        if value.isdigit() and int(value) != 0:
            if len(value) > 1:
                Saisie_Utilisateur[n_zone].set(value[0])
        else:
            Saisie_Utilisateur[n_zone].set('')
     
     
    for i in range(NB_ENTRY):
        Saisie_Utilisateur[i] = StringVar()
        Saisie_Utilisateur[i].trace("w", verification)
        Entry(fenetre, font=("Purisa", 25), bg="yellow", justify="center", textvariable=Saisie_Utilisateur[i]).place(
            x=ZonneVariable[i][1], y=ZonneVariable[i][0], height=45, width=45)
     
    fenetre.mainloop()
    En gros si je comprend bien, à chaque fois que tu modifies un widget Entry, tu te tapes la vérification de tous les contenus de l'ensemble des widgets Entry.
    EDIT: Je connais pas trop tkinter et cette méthode trace, mais en lisant le retour de args dans la fonction verification, on comprend tout de suite quoi faire pour récupérer l'indice de l'Entry concerné par la modification.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par THCH66 Voir le message
    j'ai développé ce bout de code dans lequel j'utilise des entry que je teste mon code marche bien si je ne dépasse pas 7 voir 8 entry mais dés que
    Ajoutez un print(args) juste après le début de vérification: vous devriez voir une avalanche de vérifications aux différentes variables quelque soit leur nombre. Essentiellement parce que .trace('w',....) vous permet juste de mettre à jour la variable modifiée, si là dedans vous en modifiez d'autres, les vérifications pètent en cascade et çà ne fait rien d'autre.

    La solution proposée par Fred est intéressante: elle fonctionne.
    Mais je trouve qu'elle se rattrape aux branches plutôt que d'adresser correctement le problème.

    A chaque appel de StringVar, Python lui associe un nom de la forme PY_VARn.
    Ce nom est récupérer en premier argument de "verification".

    La solution de Fred consiste à aller récupérer le "n" pour en faire un index dans la liste: laborieux!

    Plus simple serait d'utiliser la collection "dictionnaire" pour associer le nom à la variable plutôt que que la collection "liste" et ses index.
    Ce qui donnerait un truc comme:
    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
    def verification(name, *args):
        v = variables[name]
        value = v.get()
        if value.isdigit() and int(value) != 0:
            if len(value) > 1:
                v.set(value[0])
        else:
            v.set('')
     
     
    variables = {}
     
     
    for i in range(NB_ENTRY):
        v = StringVar()
        variables[str(v)] = v
        v.trace("w", verification)
        Entry(fenetre, font=("Purisa", 25), bg="yellow", justify="center", textvariable=v).place(
            x=ZonneVariable[i][1], y=ZonneVariable[i][0], height=45, width=45)
     
    fenetre.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2020
    Messages : 67
    Points : 32
    Points
    32
    Par défaut
    merci les deux solutions répondent a mon besoin
    par conter juste une petite explication de la part de wiztricks que je remercie en particulier puisque je suis à mes premiers pas avec python

    comment je parcourir le dictionnaire pour récupérer les valeurs saisies par l'utilisateur

    comment est établi le lien entre l'appel et la fonction

    v.trace("w", verification)

    verification(name, *args):

    et si je veux envoyer une variable à vérification qui prend la valeur 1 ou 2 pour dire que parfois je me limite à la saisie de 1 caractère parfois 2 ou placer cette variable

    est ce qu'il y a un cours complet qui aborde la trace et les fonctions ?????

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par THCH66 Voir le message
    comment je parcourir le dictionnaire pour récupérer les valeurs saisies par l'utilisateur
    Ah... J'étais sûr que cette question là allait revenir.
    Dans les versions récentes de Python, les dictionnaires préservent l'ordre d'insertion des clefs, valeurs.
    Ce qui veut dire que si jécris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> d = {}
    >>> for i in range(5):
    ...     d[i] = i
    ...
    On garde l'ordre d'insertion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> d
    {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}
    Et je peux récupérer la liste des valeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> list(d.values())
    [0, 1, 2, 3, 4]
    >>>
    Bon d'accord, vous avez un dictionnaire de StringVar (et non d'entiers)... mais l'ordre est aussi préservé et pour récupérer la ième valeur list(d.values())[i].get() devrait fonctionner.



    Citation Envoyé par THCH66 Voir le message
    comment est établi le lien entre l'appel et la fonction

    v.trace("w", verification)

    verification(name, *args):
    Il est établit par tkinter. On fait avec le mode d'emploi qui est donné.

    Citation Envoyé par THCH66 Voir le message
    et si je veux envoyer une variable à vérification qui prend la valeur 1 ou 2 pour dire que parfois je me limite à la saisie de 1 caractère parfois 2 ou placer cette variable
    Dans la pratique, il faut "associer" le StringVar à une valeur (1 ou 2).
    La façon moderne est de faire une classe héritée de StringVar qui récupère cette valeur.

    En attendant vous pouvez essayer "d'associer" à la main:
    A l'entrée dans le dictionnaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in range(NB_ENTRY):
        v = StringVar()
        variables[str(v)] = (v, n)
    le n étant 1 ou 2.

    Puis dans verification on récupère le n:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def verification(name, *args):
        v, n = variables[name]
    Citation Envoyé par THCH66 Voir le message
    est ce qu'il y a un cours complet qui aborde la trace et les fonctions ?????
    Hélas... Ce sont des notions avancées. Donc il faut avoir appris à patauger par soi même.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Si çà déménage trop cette histoire avec les dictionnaires, vous avez une solution peut être plus digeste (à vous de gouter) avec une liste:
    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
    from tkinter import *
     
    fenetre = Tk()
    fenetre.geometry("550x550")
     
    ZonneVariable = [[53, 53], [53, 153], [53, 203], [53, 303], [53, 353], [53, 403], [53, 453], [103, 53], [103, 153], \
                     [103, 203], [103, 253], [103, 303], [103, 353], [103, 453], \
                     [153, 53], [153, 203], [153, 253], [153, 303], [153, 353], \
                     [203, 153], [203, 203], [203, 303], [203, 453], \
                     [253, 53], [253, 103], [253, 153], [253, 253], [253, 453], \
                     [303, 103], [303, 203], [303, 303], [303, 353], [303, 403], \
                     [353, 203], [353, 303], [353, 353], [353, 403], [353, 453], \
                     [403, 103], [403, 153], [403, 203], [403, 253], [403, 353], [403, 403], \
                     [453, 53], [453, 103], [453, 153], [453, 253], [453, 353], [453, 403]]
     
    NB_ENTRY = 50  # NOMBRE DE ZONES DE SAISIE
     
    Saisie_Utilisateur = ['' for i in range(NB_ENTRY)]  # LISTE POUR LES DONNEES SAISIE PAR L'UTILISATEUR
     
    def verification(i):
        v = variables[i]
        value = v.get()
        print(name, value)
        if value.isdigit() and int(value) != 0:
            if len(value) > 1:
                v.set(value[0])
        else:
            v.set('')
     
     
    variables = []
     
     
    for i in range(NB_ENTRY):
        v = StringVar()
        variables.append(v)
        v.trace("w", lambda *a,i=i: verification(i))
        Entry(fenetre, font=("Purisa", 25), bg="yellow", justify="center", textvariable=v).place(
            x=ZonneVariable[i][1], y=ZonneVariable[i][0], height=45, width=45)
     
    fenetre.mainloop()
    Ici, le seul truc un peu fort de café est dans v.trace("w", lambda *a,i=i: verification(i))
    lambda permet de fabriquer une fonction "anonyme". Ici dans les faits, on remplace l'appel à l'ancien vérification par un nouveau en jetant a la poubelle les paramètres originaux (*a) et en ajoutant un index (i).

    Après comment récupérer 1 ou 2...
    Ce sera une fonction de cet index et à priori aussi sous la forme d'une liste.

    A vous de voir.

    Sûr qu'on ne programme pas/plus comme çà...
    Et au fur et à mesure que vous allez ajouter des fonctionnalités...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2020
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2020
    Messages : 67
    Points : 32
    Points
    32
    Par défaut
    bonjour wiztricks

    "Bon d'accord, vous avez un dictionnaire de StringVar (et non d'entiers)... mais l'ordre est aussi préservé et pour récupérer la ième valeur list(d.values())[i].get() devrait fonctionner."
    j'ai essayé est ça donne erreur est ce possible de récupérer les valeurs de entry en dehors de verification

    AttributeError: 'tuple' object has no attribute 'get'


    "Il est établit par tkinter. On fait avec le mode d'emploi qui est donné."
    est ce possible de m'expliquer comment on appel une fonction sans arguments v.trace("w",verification)
    puis on trouve deux argument lors du développement def verification(name, *args):
    alors ma question plus sur d'ou viens name et *args et à quoi correspond


    "Dans la pratique, il faut "associer" le StringVar à une valeur (1 ou 2).
    La façon moderne est de faire une classe héritée de StringVar qui récupère cette valeur.

    En attendant vous pouvez essayer "d'associer" à la main:
    A l'entrée dans le dictionnaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in range(NB_ENTRY):
        v = StringVar()
        variables[str(v)] = (v, n)

    Puis dans verification on récupère le n:"
    là le n on le fait passer dans dictionnaire est ce qu'il y à un moyen de le passer comme argument à la fonction car si je veux utiliser cette même fonction pour contrôler un autre entry (donc sans l'utilisation du dictionnaire) qui n’appartient pas à la liste des entry et qui n'a rien avoir avec les autres entry cad j'ai une liste de 25 entry que je contrôles par rapport à len()=1 et un entry par rapport à len()=2 je souhaite utiliser la même fonction de vérification


    merci d'avance

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par THCH66 Voir le message
    j'ai essayé est ça donne erreur est ce possible de récupérer les valeurs de entry en dehors de verification

    AttributeError: 'tuple' object has no attribute 'get'
    list(d.values())[i].get() fonctionne lorsqu'on a le StringVar seul comme valeur. Si on y met (StringVar, n) on se retrouve avec un tuple où le StringVar est le premier élément. Il faut viser un peu mieux: list(d.values())[i][0].get()

    Citation Envoyé par THCH66 Voir le message
    est ce possible de m'expliquer comment on appel une fonction sans arguments v.trace("w",verification)
    v.trace("w",verification) n'appelle pas une fonction. Ca dit juste à tkinter "si on écrit dans v appelle cette fonction là..."
    C'est tkinter qui va l'appeler quand...
    Après, dans la documentation, si çà dit que la fonction doit reçoit 3 arguments, le premier étant le nom de la variable, on fait avec.

    Citation Envoyé par THCH66 Voir le message
    est ce qu'il y à un moyen de le passer comme argument à la fonction car si je veux utiliser cette même fonction
    Regardez ce que je fais dans l'exemple où j'ai remplacé le dictionnaire par une liste et jouez avec lambda.

    Vous pouvez fabriquer une fonction vérification qui récupère StringVar et n en paramètre et fabriquer le lambda qui "normalise" cet appel là.
    Passez y un peu de temps pour comprendre comment çà marche, c'est un outil "puissant".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 8
    Dernier message: 16/05/2007, 16h27
  2. [RCP] Problème au niveau des icones des executables
    Par albeau dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 23/03/2006, 16h24
  3. au niveau des smileys ...
    Par ETI-trian dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 22/10/2005, 22h47

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