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 :

création en série de boutons.


Sujet :

Tkinter Python

  1. #1
    Invité
    Invité(e)
    Par défaut création en série de boutons.
    Salut tout le monde,j'ai un petit problème avec un programme et un coup de main serait vraiment le bienvenu .
    Le but est de créer automatiquement des boutons à partir d'une liste, contenant des str(un bouton pour chaque item).
    Premièrement je crée un dico, puis grâce à une boucle, je crée autant de boutons qu'il y a d'items dans la liste (chaque bouton a pour texte la str de la liste correspondante),les boutons étant "stockés" dans le dico.

    Le problème c'est quand il faut définir une commande pour chaque bouton, je m'explique : ma fenêtre possédant un Entry, je voudrais que chaque fois qu'un bouton soit cliqué, il écrive un texte dans l'Entry(ici, la lettre que je lui ai défini comme "text").

    J'ai donc essayé de configurer en série les boutons précédemment créés grâce à un boucle de type "for i in range(x)", définissant pour chaque bouton une commande (écrit()) avec comme "variable passée" (connais pas le terme exact), le texte à écrire.
    Cependant, ça a ... merdé(...), la valeur de i étant déjà arrivée à son maximum lorsque l'utilisateur veut cliquer sur un bouton...

    Voila le programme en entier(plus clair que mon roman ):

    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
    from tkinter import *
    root = Tk()
    def ecrit(x):
        entry.insert(END,x)
    entry = Entry(root)
    entry.pack()
    a = ["a","z","e","r","t","y","u","i","o","p","q","s","d","f","g","h","j","k","l","m","w","x","c","v","b","n","1"]
    b = len(a)
     
    if b%7 == 0:
        c = b//7
    elif b%7 != 0:
        c = b//7+1
     
    dicf = dict()
    for i in range(c):
        dicf[i] = Frame(root,bg = "#" + str(25*i)+ str(25*i)+ str(25*i))
        dicf[i].pack()
     
    dicb = dict()
    for i in range(len(a)):
     
        for j in range(c):
            if i>=j*7 and  i<(j+1)*7:
                dicb[i] = Button(dicf[j],text = a[i])
                dicb[i].pack(side = LEFT)
     
    for item in a:
        dicb[a.index(item)].config(command = lambda : ecrit(item))
     
     
    root.mainloop()
    J'ai bien sur pris la liste a au hasard, le but étant de pouvoir créer des boutons à partir de n'importe quelle liste contenant des str.
    D'avance merci pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 333
    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 333
    Points : 36 853
    Points
    36 853
    Par défaut
    Salut,
    Modifiez juste la construction des "command":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for item in a:
        dicb[a.index(item)].config(command = lambda z=item: ecrit(z))
    Une façon d'expliquer le pourquoi est de se mettre à la place de l'interpréteur. Lorsqu'il appellera "ecrit(item)", la valeur d'item sera la dernière valeur assignée à la variable locale "item" et non celle qu'il avait pendant la boucle "for".
    Avec "lambda z=item: ecrit(z)", le "z=item" fabrique une fonction avec un paramètre "z" qui sera "bound" à l'objet référencé par "item".
    - W

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci!!!! Ça marche nickel!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. création d'un nouveau bouton impossible
    Par cullinan dans le forum IHM
    Réponses: 15
    Dernier message: 07/10/2007, 10h38
  2. [FLASH 8] Série de boutons à désactiver
    Par lionel20 dans le forum Flash
    Réponses: 10
    Dernier message: 29/12/2006, 16h58
  3. Ouvrir le mode "création requête" avec un bouton.
    Par Goldenduck4000 dans le forum Access
    Réponses: 5
    Dernier message: 22/05/2006, 15h40
  4. [API win32 sans MFC] Création textbox et evenement bouton
    Par dacid dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 17/05/2006, 11h03
  5. [MFC] Création manuelle de contrôle bouton
    Par yanisliadon dans le forum MFC
    Réponses: 9
    Dernier message: 21/07/2005, 22h30

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