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 :

nommer un widget à partir d'une liste de noms


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2010
    Messages : 24
    Par défaut nommer un widget à partir d'une liste de noms
    Bonjour,

    J'essaie de reconstituer un tableur
    je place 10x10 widget Entry
    je voudrais attribuer à chacun, comme nom, son adresse
    bien sûr, je peux faire 100 fois cela:
    L1C1 = Entry(fenetre, ...)

    mais je voudrais attribuer le nom à partir d'une liste:
    noms = ["L1C1", "L1C2",...]

    ceci ne fonctionne pas ("L1C1 is not defined"):
    noms[0] = Entry(fenetre,...)

    je comprends qu'à gauche de '=' devrait se trouver un nom, pas une variable,
    ou bien existe-t-il un moyen de faire ce que je veux?

    Merci d'avance

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Et si tu mets dans ta liste les instances de tes entry, ça ne te convient pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    entries = []
    for i in range(10):
        entries[i] = Entry(....
    L'ordre de ta liste te permettra toujours de retrouver la bonne entry.

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    A la base, vous voulez associer un couple (i, j) à un objet.

    mais je voudrais attribuer le nom à partir d'une liste:
    noms = ["L1C1", "L1C2",...]
    Cette liste est une représentation de l'ensemble des couples (i, j) pour i, j dans [1..10] et les fonctions pour passer de (i, j) à "LiCj" sont simples.

    Dans la pratique, associer (i, j) à un objet, passe par choisir la collection qui permettra de récupérer l'objet associé à (i, j).
    Une liste (tableau) permet de faire cela de façon simple: (i, j) => v = 10*i + j.
    Mais vous devez explicitez les fonctions.

    Un dictionnaire (un dict) permet d'écrire map[(i, j)] = objet.
    La fonction d'accès sera moins performante que pour la liste mais le code sera plus proche de ce que vous voulez exprimer.
    Et rien n'empêche d'écrire map['L1C2'] = objet.

    Ce sont des principes.
    Comment les appliquer dans le contexte tkinter?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    noms = ["L1C1", "L1C2",...]
    for name in noms:
         Entry(fenetre, name=name,...)
    En fait "fenêtre" contient déjà un dict dans lequel seront rangés les "fils" avec pour nom par défaut ce que retourne id(instance d'entry). name=... permet de changer ce défaut.
    Pour récupérer l'entry suivant "name", çà passe par fenetre.children[name].

    Ceci dit, si vous voulez réaliser un tableur, le module TkTable mérite d'être regardé, utilisé,...
    Détail: il n'est pas inclus, par défaut, dans la distribution de Python
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Plus 'globalement' et avec modération svp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> root = tk.Tk()
    >>> for names in ("L1C1", "L1C2"):
    ...     globals()[names] = tk.Entry(root)
    ...     globals()[names].pack()
    ... 
    >>> root.mainloop()
    Tournez vous plus vers un dictionnaire 'a part' comme vous l'indique wiztricks.

    @+

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2010
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Transports

    Informations forums :
    Inscription : Octobre 2010
    Messages : 24
    Par défaut
    Merci à tous pour cette solution:

    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
     
    from tkinter import *
     
    fenetre = Tk()
     
    for ligne in range(1,11):
        for colonne in range(1,11):
            nom = "L" + str(ligne)+ "C" + str(colonne)
            globals()[nom] = Entry(fenetre,width = 10,justify = "center")
            globals()[nom].grid(row = ligne,column = colonne)
     
    # test
    print(L5C5["width"])
    ##print(globals())
     
    fenetre.mainloop()

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 : 4 062
    Par défaut
    Autant vous dire tout de suite que ce n'est pas la bonne manière de faire, d'où la phrase de PauseKawa

    avec modération
    Un Entry comme le reste des widgets Tkinter (et le fonctionnement est le même pour n'importe quel framework), sont des objets que l'on peut insérer et gérer facilement à l'aide d'un conteneur tel que tuple ou 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
    >>> from tkinter import *
     
    >>> 
    >>> fenetre = Tk()
    >>> 
    >>> 
    >>> LC = []
    >>> 
    >>> for ligne in range(1, 11):
    ...     for colonne in range(1, 11):
    ...         ent = Entry(fenetre, width=10, justify="center")
    ...         ent.grid(row=ligne, column=colonne)
    ...         LC.append(ent)
    ... 
    >>> print(LC[5]["width"])
    10
    >>> 
    >>> fenetre.mainloop()

  7. #7
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par jabal64 Voir le message
    je place 10x10 widget Entry
    Bien qu'un tableau de 10x10 commence à l'index 0 (et fini donc à l'index 9), de même que row/column un petit supplément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    >>> v = "L10C11"
    >>> v.split("C")
    ['L10', '11']
    >>> y = v.split("C")[1]
    >>> x = v.split("C")[0][1:]
    >>> x
    '10'
    >>> y
    '11'
    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
    from tkinter import *
     
    # Vous remarquerez que tkinter travaille avec du texte (row=x, column=y)
    noms = ["L1C1", "L1C2", "L2C1", "L2C2"]
     
    fenetre = Tk()
     
    for nom in noms:
        x = nom.split("C")[0][1:]
        y = nom.split("C")[1]
        globals()[nom] = Entry(fenetre, width=10, justify="center")
        globals()[nom].insert(END, nom)
        globals()[nom].grid(row=x, column=y)
     
    if "L1C2" in noms:
        print(L1C2["width"])
     
    fenetre.mainloop()

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

Discussions similaires

  1. [XL-2010] Macro pour renommer des fichiers à partir d'une liste de nom de fichiers
    Par thomahh dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 25/01/2013, 17h03
  2. Placement image à partir d'une liste de noms
    Par roukgreg dans le forum Langage
    Réponses: 3
    Dernier message: 17/02/2010, 13h59
  3. Réponses: 3
    Dernier message: 19/05/2005, 17h52
  4. Réponses: 3
    Dernier message: 25/04/2005, 15h26
  5. Trouver equation à partir d'une liste de points
    Par scarabee dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 27/05/2004, 17h05

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