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 :

Réflexion sur la création d'un tableau en Tkinter avec des Entry


Sujet :

Tkinter Python

  1. #1
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut Réflexion sur la création d'un tableau en Tkinter avec des Entry
    Bonjour,

    Je projette de faire une petite application qui multiplie des matrices (carrées ou non) entre elles...

    Pour ce faire, je voudrais que l'utilisateur puisse entrer facilement les valeurs de ses matrices dans des tableaux créés à la volée.

    Comme il n'y a pas de tableau en Tkinter (quelle désolation !) et que je n'ai pas encore le temps de prendre en main wxPython (une chose à la fois), je me demandais si on pouvais considérer que c'était une bonne technique de créer à la volée une boite de dialogue qui afficherait des Entry() placés avec Grid(), simulant ainsi une sorte de tableau ?

    Le tableau créé n'a pas un nombre fixe à l'avance : une fois c'est une matrice 4x3 qui devra être encodée, une autre fois, c'est une matrice de 2x5, etc...

    Est-ce une bonne pratique ou bien Entry n'est-il pas fait pour ça ?

  2. #2
    Membre confirmé
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 618
    Points
    618
    Par défaut
    Bonjour,

    Je pense que c'est comme ça que sa doit se faire.
    ici tu trouvera un agenda ou grid est utilisé pour simuler un calendrier en fessant un tableau avec des Labels. Le nombre de jours étant différent en fonction du mois certain Label son "dégridé" (et non détruit) puis "regridé" lors du changement de mois.

    sinon tu as Tix une extension de Tkinter avec un widget spécialisé pour ça.

  3. #3
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Merci Vincent pour ton programme que je ne manquerai pas d'étudier !!!

    En effet, en chipotant un peu, j'ai réussi à faire quelquechose qui ressemble vraiment à un tableau :



    Il suffit d'utiliser les fonctions grid_rowconfigure et grid_columnconfigure pour avoir une grille qui se tend et se détend quand on modifie la taille de la fenêtre...

    Voilà mon petit code de test pour faire un tableau comme dans le screenshot ci-dessus :

    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
    #!/usr/local/bin/python
    # -*- coding:utf-8 -*-
     
    from Tkinter import *
     
    class Application:
        def __init__(self, ligne, colonne):
            self.root=Tk()
            self.root.title('Tableau - v.01')
     
            for k in range(colonne):
                b=Button(self.root, text=str(k+1))
                b.grid(row=0,column=k+1,sticky=NSEW)
            self.root.grid_rowconfigure(0, weight=1)
            for m in range(ligne):
                b=Button(self.root, text=str(m+1), width=10)
                b.grid(row=m+1,column=0,sticky=NSEW)
            self.root.grid_rowconfigure(0, weight=1)
            self.root.grid_columnconfigure(0, weight=1)
     
            rows = []
            for i in range(ligne):
                cols = []
                for j in range(colonne):
                    e = Entry(self.root, justify=CENTER)
                    e.grid(row=i+1, column=j+1, sticky=NSEW)
                    e.insert(END, '(%d , %d)' % (i, j))
                    cols.append(e)
                    self.root.grid_columnconfigure(j, weight=1)
                self.root.grid_rowconfigure(i+1, weight=1)
                rows.append(cols)
     
            self.root.mainloop()
     
     
    # départ du programme principal :
    if __name__ == "__main__":
        f = Application(8,6)
    Cela dit, l'abscence de "widget table déjà tout fait" oblige à programmer toute une série de comportement et de callback pour pouvoir trier le tableau sur une colonne, pour supprimer des lignes, des colonnes, pour en insérer... Cela vaudrait la peine, je pense, de faire une classe pour pouvoir la réutiliser ensuite dans pleins d'applications...

    Il faudrait un truc simple, juste le minimum pour donner à Tkinter un petit grid digne de ce nom...

    Je pense que ce serait un bon exercice et je vais essayer de trouver du temps pour m'y atteler...

  4. #4
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Waaouww, apparemment, quelqu'un a déjà fait un truc qui a l'air sympa :

    http://tkinter.unpy.net/wiki/TkTableWrapper

    EDIT : mais j'ai du mal à faire fonctionner cette TkTableWrapper sous mon python 2.6.4. : vous aussi ???? J'ai toujours ce message d'erreur :

    TclError: package "Tktable" isn't loaded statically

  5. #5
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Ici

    @+

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 73
    Points : 63
    Points
    63
    Par défaut Tableau
    Salut Calogero,

    Je t'envoie ça comme code peut-être qu'il y a une piste pour toi ;o)
    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
    from Tkinter import *
     
    rows = []
    for i in range(5):
        cols = []
        for j in range(4):
            e = Entry(relief=RIDGE)
            e.grid(row=i, column=j, sticky=NSEW)
            e.insert(END, '%d.%d' % (i, j))
            cols.append(e)
        rows.append(cols)
     
    def onPress():
        for row in rows:
            for col in row:
                print col.get(),
            print
     
    Button(text='Ecrire', command=onPress).grid()
    mainloop()
    @++

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/05/2008, 12h17
  2. Réponses: 4
    Dernier message: 20/03/2008, 17h23

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