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

Python Discussion :

Affichage données sql dans tkinter [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Juste pour le plaisir....
    Inscrit en
    Octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Juste pour le plaisir....

    Informations forums :
    Inscription : Octobre 2017
    Messages : 7
    Par défaut Affichage données sql dans tkinter
    Hello!

    Je me suis lancé, "pour le fun", dans la découverte de Python.... et sur à peine 10 lignes de code, je me casse les dents sur 2 problèmes... : je veux me créer un (tout petit) référentiel de quelques pays, stockés dans une table sql (à partir d'un fichier csv), et afficher le contenu dans tkinter.

    Mes problèmes:

    1) le fetch me retourne bien un tuple par "row" de la table, constitué de 2 strings (code + libellé : voir "print" des valeurs ci-dessous), mais quand j'affiche les tuples dans tkinter, dans le cas d'un pays constitué de plusieurs mots (=Afrique du sud), il semble afficher le libellé comme un dictionnaire (= {Afrique du Sud} ) ? J'aimerais comprendre cette "conversion"?
    A noter que cela se passe bien si j'affiche la concaténation des éléments individuels (= ligne en commentaire).

    voici le résultat dans tkinter:
    Nom : Capture d’écran de 2020-08-31 13-45-14.png
Affichages : 1427
Taille : 6,9 Ko

    2) bien que je crois demander un affichage "à gauche", il affiche le tout en "centré" ?

    voici le code de l'affichage:
    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
    # -*- coding:Utf8 -*-
     
    # #######################################################################
    # 
    # lecture de la table des pays
    # 
    # #######################################################################
     
    import datetime
    import sqlite3
    import tkinter as tk
     
    connect   = sqlite3.connect("cave_a_vin_01.db")     # création du connecteur à la BDD
    curs_pays = connect.cursor()						# création du curseur pays
    curs_pays.execute("SELECT pays_code, pays_lib FROM pays ORDER BY pays_lib LIMIT 5")
     
    resultats = curs_pays.fetchall()
    connect.close()
     
    root = tk.Tk()
     
    frame = tk.Frame(root, bg="white")
    frame.place(relwidth=0.96, relheight=0.96, relx=0.02, rely=0.02)
     
     
    i=1
     
    for resultat in resultats:
        ligne = resultat
    #    ligne = resultat[0] + " " + resultat[1]
        label = tk.Label(frame,text=ligne, bg="white", justify="left")
        label.pack()
     
        print(" ")
        print("resultat :", i, " : ",resultat, " -- ", type(resultat))
        print("0 : ",resultat[0], " -- ", type(resultat[0]))
        print("1 : ",resultat[1], " -- ", type(resultat[1]))
        print("-----------------------------------------------")
        print(" ")
        i=i+1
     
     
    root.mainloop()

    L'output des "print" dans le shell, où tout semble être ok:
    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
     
    resultat : 1  :  ('ZA', 'Afrique du Sud')  --  <class 'tuple'>
    0 :  ZA  --  <class 'str'>
    1 :  Afrique du Sud  --  <class 'str'>
    -----------------------------------------------
     
     
    resultat : 2  :  ('DE', 'Allemagne')  --  <class 'tuple'>
    0 :  DE  --  <class 'str'>
    1 :  Allemagne  --  <class 'str'>
    -----------------------------------------------
     
     
    resultat : 3  :  ('AR', 'Argentine')  --  <class 'tuple'>
    0 :  AR  --  <class 'str'>
    1 :  Argentine  --  <class 'str'>
    -----------------------------------------------
     
     
    resultat : 4  :  ('AU', 'Australie')  --  <class 'tuple'>
    0 :  AU  --  <class 'str'>
    1 :  Australie  --  <class 'str'>
    -----------------------------------------------
     
     
    resultat : 5  :  ('AT', 'Autriche')  --  <class 'tuple'>
    0 :  AT  --  <class 'str'>
    1 :  Autriche  --  <class 'str'>
    -----------------------------------------------
    Merci pour votre aide!!







    si besoin: la création de la table:
    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
    # -*- coding:Utf8 -*-
     
    # #######################################################################
    # 
    # init_create_sql_pays01.py
    # Création de la table des pays à partir d'un fichier CSV
    # 
    # #######################################################################
     
    # ########## Import External Functions ########################################################
     
    import os
    import csv
    import datetime
    import sqlite3
     
    # ########## Define Local Functions ###########################################################
     
    # ---------- Fonctions -------------------------------------------------------------------------
     
    def create_table_pays():
     
    	curs_pays.executescript("""
     
                            DROP TABLE IF EXISTS pays;
     
                            CREATE TABLE IF NOT EXISTS pays (
                            pays_code TEXT NOT NULL,
                            pays_lib TEXT NOT NULL,
                            pays_carte TEXT NULL,
                            PRIMARY KEY ([pays_code]))
                    """)
     
    def fill_table_pays():     # lire enregistrements CSV et les rentrer dans la table SQL
     
    	key=0
    	os.chdir("/home/papy7584/Programmation/Prog/CAVSimple/Data/20200828")  # workdirectory: contient les données
    	sql = """ INSERT INTO pays(pays_code, pays_lib, pays_carte) VALUES(?,?,?) """
     
    	with open("pays.csv") as pays_csvfile:
    		pays_csv = csv.reader(pays_csvfile, delimiter=',')
    		for enr_pays in pays_csv: 
    			if enr_pays[0] != "pays_code":									# skip titres
    				print(enr_pays[0], " - ", enr_pays)
    				print(enr_pays[0]," ",type(enr_pays[0]),len(enr_pays[0]))
    				print(enr_pays[1]," ",type(enr_pays[1]),len(enr_pays[1]))
    				print(enr_pays[2]," ",type(enr_pays[2]),len(enr_pays[2]))
     
    				l = (
    					enr_pays[0], 
    					enr_pays[1], 
    					enr_pays[2])
    				curs_pays.execute(sql, l)
     
    	connect.commit()
     
    # ########## Main #############################################################################
     
    connect   = sqlite3.connect("cave_a_vin_01.db")     # création du connecteur à la BDD
    curs_pays = connect.cursor()						# création du curseur pays
     
    create_table_pays()
    fill_table_pays()
     
    connect.close()
    et le contenu du fichier csv:
    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
    cat pays.csv
    "pays_code","pays_lib","pays_carte"
    "ZA","Afrique du Sud",
    "DE","Allemagne",
    "AR","Argentine",
    "AU","Australie",
    "AT","Autriche",
    "CL","Chili",
    "ES","Espagne",
    "FR","France",
    "GR","Grèce",
    "IT","Italie",
    "LU","Luxembourg",
    "NZ","Nouvelle-Zélande",
    "PT","Portugal",

  2. #2
    Membre confirmé
    Homme Profil pro
    Curieux
    Inscrit en
    Avril 2020
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2020
    Messages : 114
    Par défaut
    Salut,
    Je comprends pas trop purquoi mais :
    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
    import tkinter as tk
     
    root = tk.Tk()
     
    frame = tk.Frame(root, bg="white")
    frame.place(relwidth=0.96, relheight=0.96, relx=0.02, rely=0.02)
     
    resultats = tuple(["ZA","Afrique du Sud",
                "DE","Allemagne",
                "AR","Argentine",
                "AU","Australie",
                "AT","Autriche",
                "CL","Chili",
                "ES","Espagne",
                "FR","France",
                "GR","Grèce",
                "IT","Italie",
                "LU","Luxembourg",
                "NZ","Nouvelle-Zélande",
                "PT","Portugal",
                ])
     
    for i in range(0,len(resultats)-1,2):
        ligne = resultats[i]+ " " +resultats[i+1]
        label = tk.Label(frame,text=ligne, bg="white", justify="left")
        label.pack()
        print(" ")
        print("resultat :", i, " : ",resultats[i], " -- ", type(resultats))
        print("0 : ",resultats[i], " -- ", type(resultats[0]))
        print("1 : ",resultats[i+1], " -- ", type(resultats[1]))
        print("-----------------------------------------------")
        print(" ")
    root.mainloop()
    je n'ai pas ton soucis d'affichage en list ou en tuple ^^

  3. #3
    Membre du Club
    Homme Profil pro
    Juste pour le plaisir....
    Inscrit en
    Octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Juste pour le plaisir....

    Informations forums :
    Inscription : Octobre 2017
    Messages : 7
    Par défaut
    Bonjour!

    Merci pour ton retour! En exécutant ton code, je n'ai pas le pb non plus... en même temps, ton code est proche de ma remarque:

    *) quand j'affiche le tuple (row=résultat du fetch), j'ai le problème:
    resultats = curs_pays.fetchall()
    for resultat in resultats:
    ligne = resultat
    label = tk.Label(frame,text=ligne, bg="white", justify="left")


    *) par contre, le suivant fonctionne bien (affichage individuel des éléments du tuple, comme tu fais):
    resultats = curs_pays.fetchall()
    for resultat in resultats:
    ligne = resultat[0] + " " + resultat[1]
    label = tk.Label(frame,text=ligne, bg="white", justify="left")


    J'ai donc effectivement un moyen pour contourner le pb, mais étant donné que mon objectif est d'apprendre, j'aimerais comprendre pourquoi j'ai un souci avec l'affichage du tuple en entier?

  4. #4
    Membre confirmé
    Homme Profil pro
    Curieux
    Inscrit en
    Avril 2020
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Curieux
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2020
    Messages : 114
    Par défaut
    ba je dirais que c'est parce que tu mets un iterable dans une variable, ligne = resultat, resultat est un tuple et resultat[0] ne l'est pas. Si je dit pas de ...

    puis pour ton soucis nb 2 ba , je sais pas pourquoi non plus j'y arrive, mais ton texte est bien aligné, c'est ton frame qui est centrer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    for i in range(0,len(resultats)-1,2):
        ligne = resultats[i]+ " " +resultats[i+1]
        label_1 = tk.Label(frame, text=ligne,bg="white",)
        label = tk.Label(frame,
                         text=ligne,
                         width = 38,
                         height = 2,
                         bg="white",
                         #anchor = tk.E,
                         #justify = tk.RIGHT
                         )
     
        label_1.pack(anchor="w")
        label.pack(anchor="w")
    Edit : pardon si je sais, c'est bien avec le pack(anchor = ""), que tu positionnes ton frame, le width = 38 modifie l'alignement, commente le et tout est à gauche.

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

    Citation Envoyé par Papy84 Voir le message
    1) ...mais quand j'affiche les tuples dans tkinter, dans le cas d'un pays constitué de plusieurs mots (=Afrique du sud), il semble afficher le libellé comme un dictionnaire (= {Afrique du Sud} )
    Si un widget affiche du texte, vous devez lui passer le texte à afficher et non une autre structure de données sinon, tkinter fera "ce qu'il peut" pour l'afficher mais côté rendu (ce qu'on voit) vous aurez des surprises.
    "Ce qu'il peut" est en général appliquer str à l'objet avant de l'expédier à TCL/Tk qui interprétera à son tour la chaine de caractères avant de l'afficher... mais çà fonctionne assez bien pour les types simples: int, float,...

    2) bien que je crois demander un affichage "à gauche", il affiche le tout en "centré" ?
    Il y a 2 choses à bien distinguer: le texte (une ou plusieurs lignes à afficher) qui aura besoin d'occuper un rectangle +/- grand pour être affiché complètement. justify et anchor "bougent" le texte dans ce rectangle.

    Ce rectangle sera la place occupée par le Label à afficher dans la "fenêtre". A ce moment là, c'est "pack" ou "grid" qui entrent en ligne de compte.

    Imaginez plusieurs Labels avec des textes de longueur différente. Par défaut, ils occuperont une place différente et aligner les différents rectangles via le centre, les bords droits/gauches,... sera à préciser à pack/grid.

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

  6. #6
    Membre du Club
    Homme Profil pro
    Juste pour le plaisir....
    Inscrit en
    Octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Juste pour le plaisir....

    Informations forums :
    Inscription : Octobre 2017
    Messages : 7
    Par défaut Merci!
    Salut!

    Les explications de wiztricks complètent bien les réponses de Aelurus_, et, surtout, me permettent de comprendre, ce qui était mon objectif:

    - Etonnant que le widget transforme le string du tuple en dictionnaire, mais c'est ainsi - l'explication est claire et logique - au moins, je sais que le pb est dans l'affichage, et non pas dans mes tables SQL, et du coup je sais comment faire pour la suite (je pense... )
    - Parfait l'explication sur tkinter - je pense avoir compris: je vais tester tout ça!

    Merci!

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

    Citation Envoyé par Papy84 Voir le message
    Etonnant que le widget transforme le string du tuple en dictionnaire,
    Ce n'est pas parce que vous voyez des { } s'afficher que c'est un dictionnaire: n'oubliez pas que tkinter est écrit en TCL/Tk, un langage de programmation très différent de Python.

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

  8. #8
    Membre du Club
    Homme Profil pro
    Juste pour le plaisir....
    Inscrit en
    Octobre 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Juste pour le plaisir....

    Informations forums :
    Inscription : Octobre 2017
    Messages : 7
    Par défaut
    Hello;

    Citation Envoyé par wiztricks Voir le message
    Ce n'est pas parce que vous voyez des { } s'afficher que c'est un dictionnaire: n'oubliez pas que tkinter est écrit en TCL/Tk, un langage de programmation très différent de Python.
    Bien vu! Effectivement... une déduction un peu hâtive... - décidément, je n'ai pas encore les bons réflexes Python

    Merci!

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

Discussions similaires

  1. Affichage données SQL
    Par Yann_br dans le forum ASP.NET
    Réponses: 6
    Dernier message: 27/09/2007, 07h53
  2. Réponses: 1
    Dernier message: 16/07/2007, 14h08
  3. exporter données sql dans un fichier csv en java
    Par pinkemma dans le forum JDBC
    Réponses: 2
    Dernier message: 07/03/2007, 09h23
  4. Charger une base de données Sql dans un datagrid!
    Par misscricri dans le forum Windows Forms
    Réponses: 7
    Dernier message: 18/01/2007, 11h42
  5. Transposer des données sql dans un fichier texte
    Par Anakior dans le forum Outils
    Réponses: 3
    Dernier message: 11/12/2005, 10h01

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