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 :

ttk.treeview formatage des donnees [Python 2.X]


Sujet :

Tkinter Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Par défaut ttk.treeview formatage des donnees
    Bonjour à tous,

    Je teste l’interface tkinter pour créer un programme de saisi d'alimentation de bdd.J'en suis aujourd'hui a essayer d'afficher mes retours de requêtes dans un treeview.
    Cependant, après de nombreux tests je constate que je ne peux pas afficher un champ de caractères long(multilignes) dans une cellule de ce treeview car je n'arrive pas à gérer sa hauteur. Je ne trouve pas l'option qui permet de le faire, et il me semble même qu'elle n'existe pas.

    De plus j'ai un souci de connexion du scrollbar X qui ne s'active que si j'étire la cellule, me permettant de voir le reste de la cellule,bien que je l'ai invalidé,.

    Je vous mets mon code débarrassé des traitements annexes qui ne vous serviront a rien.Si j'ai bien recopié vous devriez voir 3 cadres avec 1 bouton qui activera la création du treeview et l'affichage des données(simulées) de bdd.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    # -*- coding:Utf-8 -*-
     
    import tkinter as tk
    import ttk
     
    class Fenetre(tk.Tk)*:
     
        def __init__(self, master=None):
            tk.Tk.__init__(self,master)
            self.dict_produit=['ref(10)','Nom(20)','Fabricant(15)','Details(50)']
            self.produits=[['123456','Aspirateur','Rowenta','garanti 2 ans pieces et main d œuvre'],['1234678','Television','Panasonic','technologie LED'],
                               ['123456789','Réfrigirateur','Carrefour','fksdfksm dfkdlmsfk lkflmsdk flkf kfsdlm dfjksdlj fjsdkljfd jfklsdjkj fskljkl fskdjflksj fsdklfjsl jklsdjfkljs kllsfjsdklfjsl,
    		           klskdfjfjdsfh dhfjksh jhdksj fhks jksdhfsjk dfjksdhf jkhf ksdhfksdjhf sk jdfhkshks df fsdfs  zerze rzfs fsd ziorzu ze sdfo z ruzeio ueiozu od']]
     
             self.geometry('800x500+100+100')
             self.IG_basique()
     
        def IG_basique(self):
            #Creation 3 cadres pour formater la fenetre
            self.cadre1=tk.Frame(self,bg='yellow',width=100,height=250)
            self.cadre2=tk.Frame(self,bg='grey',width=650,height=250)
            self.cadre3=tk.Frame(self,width=100,height=250)
            self.bout1=tk.Button(self.cadre2,text='validez',command=self.affich_curs)
            self.msg=tk.Message(self,bg='orange',aspect=150,width=650)
            self.cadre1.grid(row=1,column=0,padx=1,pady=1)
            self.cadre2.grid(row=1,column=1,padx=1,pady=1)
            self.cadre2.grid_propagate(0)
            self.cadre3.grid(row=1,column=2,padx=1,pady=1)
            self.bout1.grid(column=1,padx=1,pady=1)
            self.msg.grid(row=3,column=1,padx=1,pady=1,sticky='ew')
     
        def affich_curs(self):
            #Suppression du cadre d origine utile pour de la saisie
            #Remplacement par un nouveau cadre qui accueillera le treeview
             if isinstance(self.cadre2,tk.Frame):
                 self.cadre2.grid_remove()
             self.cadre4=tk.Frame(self,width=650,height=250,bg='grey')
             #Ici je vais recuperer une liste des tailles max de champs contenus dans self.produit pour
             # formater les colonnes de manière homogene 
             self.val_li=0
             self.val_col=0
             self.taille_cell=[]
             for self.val_li in range(len(self.dict_produit)):
                 self.taille_cell_trans=0
                 for self.val_col in range(len(self.produits)):
                     if len(self.produits[self.val_col][self.val_li])>self.taille_cell_trans:
                          self.taille_cell_trans= len(self.produits[self.val_col][self.val_li])
                     #Ici je mets des valeurs un peu particulières car les cellules se mesurent en pixel et j'ai mal
                     # établi la concordance pour avoir une taille d affichage correcte.Ca ne gene pas la
                     # création du treeview
                     if self.taille_cell_trans>150:
     	         self.taille_cell_trans=400
                     else:
    		     self.taille_cell_trans=self.taille_cell_trans*8
            self.taille_cell.append(self.taille_cell_trans)
        #Init treeview
        self.tview1=ttk.Treeview(self.cadre4,columns=tuple([col[:-4] for col in self.dict_produit]),show='headings',height=2)
     
        #Init des scrollbars
        self.x_asc=tk.Scrollbar(self.cadre4,command=self.tview1.xview, orient=tk.HORIZONTAL)  
        self.y_asc=self.x_asc=tk.Scrollbar(self.cadre4,command=self.tview1.yview, orient=tk.VERTICAL) 
        self.tview1.config(xscrollcommand=self.x_asc.set)
        self.tview1.config(yscrollcommand=self.y_asc.set)
        #Creation du treeview
        for index in range(len(self.dict_produit)):
            self.tview1.heading((self.dict_produit[index])[:-4],text=(self.dict_produit[index])[:-4]))
            self.tview1.columns((self.dict_produit[index])[:-4],width=self.taille_cell[index],stretch='false',anchor=tk.W)
     
         #Mise en forme des données
         for index in range(len(self.produits)):
             self.tview1.insert(' ',index,values=self.produits[index])
     
         self.tview1.grid_propagate(0)
         self.tview1.grid(row=1,column=0,sticky=tk.NSEW)
         self.cadre4.grid_propagate(0)
         self.cadre4.grid(row=1,column=1,padx=1,pady=1)
     
    #Programme appelant
    monapp=Fenetre()
    monapp.mailoop()
    Merci pour votre aide
    Cordialement

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

    Citation Envoyé par estrasse Voir le message
    Je vous mets mon code débarrassé des traitements annexes qui ne vous serviront a rien.Si j'ai bien recopié vous devriez voir 3 cadres avec 1 bouton qui activera la création du treeview et l'affichage des données(simulées) de bdd.
    Si vous postez du code autant qu'on puisse l'exécuter... sinon çà (ne vous) aide pas.

    Citation Envoyé par estrasse Voir le message
    Cependant, après de nombreux tests je constate que je ne peux pas afficher un champ de caractères long(multilignes) dans une cellule de ce treeview car je n'arrive pas à gérer sa hauteur. Je ne trouve pas l'option qui permet de le faire, et il me semble même qu'elle n'existe pas.
    Est-ce que vous pensez qu'un widget comme Treeview soit approprié pour afficher une colonne avec un texte libre de longueur quelconque?

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

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Par défaut
    re,

    Normalement le code fonctionne.J'ai du le recopier sur une autre machine car celle sur laquelle je code n'est pas relié au web(boulot), mais je l'ai testé.J'ai juste enlevé des procédure de tests sur des requêtes qui n’interagissent en rien avec ma demande courante.

    Le treeview me semble approprié pour afficher des retours de requêtes sql. J'ai d'abord testé avec des tk.label mais sur de longs curseurs je n'arrive pas a afficher proprement mes retours de requêtes.A savoir que je n'ai pas trouvé de conteneur a slider pour afficher tous mes enregistrements. le Treeview émule une sorte de datagrid qui colle parfaitement avec mon besoin.

    Après recherches,j'ai vu ce widget qui semble bien fonctionner sauf dans le cas d'une cellule devenue multi-lignes du fait d'un champ long.Dans mon cas, la taille de la cellule ne s'adapte pas au nombre de caractères rapporté.De plus ça coince avec le scrollbar.Mais mis à part ce petit problème, il m'affiche bien mes enregistrements.Si je peux modifier la taille des cellules alors ça ira tip top.

    Sinon vous avez une autre idée de widget pour ce traitement?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 687
    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 687
    Par défaut
    Citation Envoyé par estrasse Voir le message
    Normalement le code fonctionne.J'ai du le recopier sur une autre machine car celle sur laquelle je code n'est pas relié au web(boulot), mais je l'ai testé.J'ai juste enlevé des procédure de tests sur des requêtes qui n’interagissent en rien avec ma demande courante.
    Regardez autour de la ligne 56:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           self.taille_cell.append(self.taille_cell_trans)
        #Init treeview
        self.tview1=ttk.Treeview(self.cadre4,columns=tuple([col[:-4] for col in self.dict_produit]),show='headings',height=2)
    self.tview1 est au même niveau que la déclaration des méthodes.
    On se retrouve avec un "self" non défini lors de la construction de la classe.
    Ca ne peut pas fonctionner: vous pourriez quand même vérifier au lieu de camper sur vos sabots.

    De plus "montrer le problème" n'est pas si compliqué:
    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
    from tkinter import *
    import tkinter.ttk as ttk
     
    tree = ttk.Treeview()
    columns = ('A', 'B')
    tree["columns"] = columns
    for s in columns:
        tree.column(s, width=100)
        tree.heading(s, text="column %s" % s)
     
    for x in range(3):
        tree.insert("" , x,    text="Line %d" % x, values=("1A","1B\n"*3))
     
    tree.pack()
    mainloop()
    Visuellement, vous voyez bien que les items de type texte "multilignes" ne sont pas gérées.


    Citation Envoyé par estrasse Voir le message
    Sinon vous avez une autre idée de widget pour ce traitement?
    Ce n'est pas une question de traitement mais d'affichage de données inadaptées au widget que vous voulez utiliser.
    Quelles sont les attentes de l'utilisateur sur ces données là? Parfois il suffit de gérer çà en mode tooltip: on n'affiche que le début.... et le reste sera visualisé dans une pop-up au cas par cas.

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

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Par défaut
    désolé il y a une indentation qui m'a échappée.Comme je teste sur mon autre machine sur laquelle cela marche, malgré ma vérification, j'en ai loupé(mais je m'y attendais un peu,c'est trop bizarre sinon).Je regarderai attentivement votre code mais pour l'heure je n'ai que quelques heures d'apprentissage sur ce widget.J'aurais du mentionné que je suis débutant aussi.

    Votre idée, j'y ai pensé mais je préférerai une visualisation immédiate dans un beau tableau.Ensuite je comptais effectivement cliquer sur une ligne pour la récupérer et faire des modifications(si souhaitées).Dans mon application, je ne peux pas formaliser une ID unique par fiche donc je la calcule avec une règle de gestion pas très heureuse et surtout qui ne permettra pas d'identifier à coup sûr le produit ou autre.Le risque d'erreur est grand surtout sur des homonymes.En vérifiant les détails directement ça éviterait des manipulations. Mais bon avec tkinter je me suis malheureusement habitué a devoir souvent trouver des subterfuges.Mais là,je ne trouve pas...

    Enfin si vous n'avez pas de plan B a me proposer, je vais devoir renoncer à certaines facilités et me rabattre sur l'idée que vous avez énoncé si dessus.

    ps:Sinon pour un dilettante, intéressé par python mais débutant, vous conseilleriez lequel question facilité/rapidité d'apprentissage: WXpython ou PyQT?

    Merci

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 687
    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 687
    Par défaut
    Citation Envoyé par estrasse Voir le message
    Votre idée, j'y ai pensé mais je préférerai une visualisation immédiate dans un beau tableau.Ensuite je comptais effectivement cliquer sur une ligne pour la récupérer et faire des modifications(si souhaitées).Dans mon application, je ne peux pas formaliser une ID unique par fiche donc je la calcule avec une règle de gestion pas très heureuse et surtout qui ne permettra pas d'identifier à coup sûr le produit ou autre.Le risque d'erreur est grand surtout sur des homonymes.En vérifiant les détails directement ça éviterait des manipulrations. Mais bon avec tkinter je me suis malheureusement habitué a devoir souvent trouver des subterfuges.Mais là,je ne trouve pas...
    Vous ne pourrez visualiser que N lignes et M colonnes.
    C'est pas si compliqué de construire un widget composé de NxM Label et/ou d'Entry et/ou de Text gérés par .grid.

    Citation Envoyé par estrasse Voir le message
    ps:Sinon pour un dilettante, intéressé par python mais débutant, vous conseilleriez lequel question facilité/rapidité d'apprentissage: WXpython ou PyQT?
    Les deux sont intéressants. Essayez de passer un peu de temps à lire quelques tutos sur chacun pour voir celui que vous comprenez le mieux. Au vu des discussions qu'il y a dans les forums de DVP, PyQt est plus pratiqué que Wx. Ce qui ne veut pas dire qu'il soit meilleur ni le plus rapide/facile à comprendre pour vous.

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

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 28
    Par défaut
    Merci M.Wiztricks.

    En effet j'ai créé un datagrid avec des labels formatés pour afficher mes curseurs de requêtes.Mais lorsque j'ai plusieurs enregistrements il semble impossible de les scroller dans des conteneurs les accueillants.Exemple, je crée un frame+tk.Text et j'affiche mes lignes de curseurs dans le tk.Text.En imaginant que l’ensemble des lignes déborde du widget Text, le scrollbar que je mets en place ne semble pas se connecter au widget conteneur(Text) pour mes les montrer tous. Par contre ça fonctionne dès que j'écris dans ce w.Text et que je sors du champs d'affichage. Je ne comprends pas trop la relation et ce qui empêche de scroller ces labels.

    Ma foi, je vais faire autrement et faire dans l'idée de ce que vous m'avez suggéré.

    Merci pour votre aide

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 687
    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 687
    Par défaut
    Citation Envoyé par estrasse Voir le message
    En effet j'ai créé un datagrid avec des labels formatés pour afficher mes curseurs de requêtes.Mais lorsque j'ai plusieurs enregistrements il semble impossible de les scroller dans des conteneurs les accueillants.Exemple, je crée un frame+tk.Text et j'affiche mes lignes de curseurs dans le tk.Text.En imaginant que l’ensemble des lignes déborde du widget Text, le scrollbar que je mets en place ne semble pas se connecter au widget conteneur(Text) pour mes les montrer tous. Par contre ça fonctionne dès que j'écris dans ce w.Text et que je sors du champs d'affichage. Je ne comprends pas trop la relation et ce qui empêche de scroller ces labels.
    Je comprends que vous n'arrivez pas à obtenir ce que vous voulez, mais pas facile de comprendre comment vous vous y prenez sans que vous postiez un minimum de lignes de code.

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

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

Discussions similaires

  1. [VB6] exporter des données de Vb vers word
    Par ptitjean80 dans le forum VB 6 et antérieur
    Réponses: 18
    Dernier message: 29/05/2004, 02h50
  2. Réponses: 5
    Dernier message: 11/12/2003, 14h45
  3. Comment inserer des donnee de type Large Object !!
    Par josoft dans le forum Requêtes
    Réponses: 4
    Dernier message: 20/07/2003, 11h21
  4. [] Impression des donnees sur etiquettes
    Par der dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 03/12/2002, 15h43
  5. importer des donnees dans interbase
    Par ms91fr dans le forum InterBase
    Réponses: 3
    Dernier message: 25/11/2002, 17h43

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