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 :

modifier valeur listbox tkinter connexion sql serveur


Sujet :

Tkinter Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut modifier valeur listbox tkinter connexion sql serveur
    Bonjour,


    Nom : 2018-05-27_19h37_50.png
Affichages : 756
Taille : 3,9 Ko

    J'ai créé une base de données sql serveur jusqu'à la tout va bien, j'arrive à afficher mes données dans la listbox de tkinter.

    Nom : 2018-05-27_19h39_38.png
Affichages : 975
Taille : 23,0 Ko

    Après avoir sélectionner une ligne dans ma listbox je n'arrive pas à récupérer la valeur du champ PartDescription, celui-ci affiche les
    2 premiers caractères du champ ID ?


    backend.py

    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
     
     
    import pyodbc
     
     
    class Database:
     
        def __init__(self, db):
     
            self.conn = pyodbc.connect(db)
            self.cur = self.conn.cursor()
            self.cur.execute("SELECT * FROM dbo.tblPartMain")
            self.conn.commit()
     
     
     
        def view(self):
            self.cur.execute("SELECT * FROM dbo.tblPartMain")
            rows = self.cur.fetchall()
            return rows
     
        def search(self, PartDescription="", MfrPartNumber=""):
            self.cur.execute("SELECT * FROM dbo.tblPartMain WHERE PartDescription=? OR MfrPartNumber=?", PartDescription, MfrPartNumber)
            rows=self.cur.fetchall()
            return rows
     
     
        def __del__(self):
            self.conn.close()

    frontend.py

    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
     
     
    from tkinter import *
    from backend import Database
     
    database = Database('DRIVER={ODBC Driver 13 for SQL Server};SERVER=XD\SQLEXPRESS;user=XD*****\X****,'
          'password="";Trusted_Connection=yes;DATABASE=bdd_doce')
     
     
     
     
    def get_selected_row(event):
        global selected_tuple
        index = list1.curselection()[0]
        selected_tuple = list1.get(index)
        e1.delete(0, END)
        e1.insert(END, selected_tuple[1])
        e2.delete(0, END)
        e2.insert(END, selected_tuple[2])
     
     
     
    def view_command():
        list1.delete(0,END)
        for row in database.view():
            list1.insert(END,row)
     
    def search_command():
        list1.delete(0,END)
        for row in database.search(PartDescription_text.get(), MfrPartNumber_text.get()):
            list1.insert(END, row)
     
    window = Tk()
     
    window.wm_title("Liste de Pièces")
     
    l1 = Label(window, text="PartDescription")
    l1.grid(row=0, column=0)
     
    l2 = Label(window, text="MfrPartNumber")
    l2.grid(row=0, column=2)
     
     
    PartDescription_text=StringVar()
    e1 = Entry(window, textvariable=PartDescription_text)
    e1.grid(row=0, column=1)
     
    MfrPartNumber_text=StringVar()
    e2=Entry(window, textvariable=MfrPartNumber_text)
    e2.grid(row=0,column=3)
     
     
     
    list1=Listbox(window, height=6, width=35)
    list1.grid(row=2, column=0, rowspan=6,columnspan=2)
     
    sb1=Scrollbar(window)
    sb1.grid(row=2,column=2, rowspan=6)
     
    list1.configure(yscrollcommand=sb1.set)
    sb1.configure(command=list1.yview)
     
    list1.bind('<<ListboxSelect>>', get_selected_row)
     
    b1 = Button(window,text="Lister Pièces", width=12, command=view_command)
    b1.grid(row=2, column=3)
     
    b2 = Button(window,text="Rechercher", width=12, command=search_command)
    b2.grid(row=3, column=3)
     
     
    window.mainloop()
    Comment puis je récupérer cette valeur sachant que cela fonctionne avec une base de données sqlite ?
    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Citation Envoyé par dockys Voir le message
    Comment puis je récupérer cette valeur sachant que cela fonctionne avec une base de données sqlite ?
    Si çà fonctionne avec sqlite, c'est que la fonction/callback search_command arrive à récupérer des données (depuis la base) via l'appel à database.search.
    Et tout l'intérêt de découper son code en module est de pouvoir tester que ce database.search "fonctionne"/retourne des informations avant d'en afficher le résultat dans une listbox.
    Dit autrement, vous voulez que çà affiche des valeurs sans vous être assuré qu'au moins une valeur était retournée... Dommage car çà on ne peut pas le faire pour vous (parce qu'on n'a pas les données).

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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Bonsoir,

    Merci pour votre réponse mais il semblerait que sql server a ses colonnes de largeur fixe par défaut et pas sqlite je me trompe ?
    Alors je ne vois pas trop comment contourner ce problème ?

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par dockys Voir le message
    Merci pour votre réponse mais il semblerait que sql server a ses colonnes de largeur fixe par défaut et pas sqlite je me trompe ?
    Alors je ne vois pas trop comment contourner ce problème ?
    Je ne vois pas le rapport avec la question initiale: "modifier valeur listbox tkinter".
    De plus si vous insérez un tuple comme ligne dans la listbox, çà deviendra un "string".
    Puis en écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def get_selected_row(event):
        global selected_tuple
        index = list1.curselection()[0]
        selected_tuple = list1.get(index)
        e1.delete(0, END)
        e1.insert(END, selected_tuple[1])
        e2.delete(0, END)
        e2.insert(END, selected_tuple[2])
    çà affichera les 2ème et 3èmes caractères de cette string là.

    Et si vous appliquez le même traitement à une row sqlite, pourquoi voulez vous que çà fasse autre chose? Il n'y a plus de colonnes juste une chaîne de caractères...

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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Oui je pense comprendre mais en fait je souhaiterai non pas récupérer la chaîne de caractères qui est variable mais la valeur du champ Partdescription de ma base de données quelque soit sa taille soit exemple "Joint vitre" ou "Cale" ?

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par dockys Voir le message
    Oui je pense comprendre mais en fait je souhaiterai non pas récupérer la chaîne de caractères qui est variable mais la valeur du champ Partdescription de ma base de données quelque soit sa taille soit exemple "Joint vitre" ou "Cale" ?
    La valeur de ce champ vous l'avez déjà pour chercher les enregistrements dans la base:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def search_command():
        list1.delete(0,END)
        for row in database.search(PartDescription_text.get(), MfrPartNumber_text.get()):
            list1.insert(END, row)
    et les tuples qui sont retournés vous les écrabouillez avec le list1.insert: ils deviennent les "str" que vous récupérez plus loin.
    Outre que je ne comprends pas trop ce que vient faire tkinter là dedans, je ne vois pas non plus ce que vous cherchez à faire (en tout cas, çà semble bien plus compliqué que le code que vous avez posté et je ne suis pas dans votre tête).

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

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    D'accord mais dans ce cas la pourquoi avec SQLite il me renvoit :
    print(type(selected_tuple))
    <class 'tuple'>


    et SQL serveur :
    print(type(selected_tuple))
    <class 'str'>

    J'ai contourné le problème en convertissant en tuple pour sql serveur mais cela reste du bricolage !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    def get_selected_row(event):
        global selected_tuple
        index = list1.curselection()[0]
        selected_tuple = list1.get(index)
        demo = selected_tuple.split(',')
        demo1 = tuple(demo)
        print(type(demo1))
        e1.delete(0, END)
        e1.insert(END, demo1[0])


    Merci d'avance

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Salut,

    Citation Envoyé par dockys Voir le message
    D'accord mais dans ce cas la pourquoi avec SQLite il me renvoit :
    print(type(selected_tuple))
    <class 'tuple'>


    et SQL serveur :
    print(type(selected_tuple))
    <class 'str'>
    Intéressant... car je n'aurais jamais osé le faire, et pourtant çà fonctionne!
    Donc si çà retourne un tuple lorsqu'on a stocké un tuple, c'est peut être que c'est un "str" qui est retourné lorsqu'on stocke un str.

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

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Désoler mais j'ai pas tout suivi la... pouvez vous expliciter ?
    Merci

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par dockys Voir le message
    Désoler mais j'ai pas tout suivi la... pouvez vous expliciter ?
    Ce que j'essaie de vous expliquer, c'est que la listbox affiche une liste de strings.
    Et bien que çà ait l'air de fonctionner avec aussi avec des "tuple", je doute que cela fonctionne parce que cela a été construit pour. Je pense que si çà marchotte dans des cas particuliers, c'est le résultat d'effets de bords à déterminer.

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

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Merci pour l'explication, je continue mes recherches pour améliorer le code.

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Citation Envoyé par dockys Voir le message
    Merci pour l'explication, je continue mes recherches pour améliorer le code.
    Déjà remplacer la listbox par un treeview serait pas mal.

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

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Merci pour cette info qui m'a fait tilt dans la tête !
    En effet j'ai remplacé par un treeview et modifier mon code qui produisait un effet de bord ....
    j'ai modifié ma fonction et mon problème est résolu...
    Je n'ai pas encore terminé le programme mais il a bien avancé celaprend du temps de se casser la tête mais on avance à petit pas...

    une partie du code

    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
     
    tree = Treeview(fen1, columns=("ID", "MfrPartNumber"), selectmode="extended")
    tree.heading('ID', text="ID", anchor=W)
    tree.heading('MfrPartNumber', text="MfrPartNumber", anchor=W)
    tree.column('#0', stretch=NO, minwidth=0, width=0)
    tree.column('#1', stretch=NO, minwidth=0, width=50)
     
    tree.bind('<Double-Button-1>', OnSelected)
     
    # ----vertical scrollbar------------
    vbar = Scrollbar(fen1, orient=VERTICAL, command=tree.yview)
    tree.configure(yscrollcommand=vbar.set)
    tree.grid(row=0, column=0, columnspan=3,rowspan=3)
    vbar.grid(row=0, column=3, columnspan=3,rowspan=3,sticky=NS)
     
    # ----horizontal scrollbar----------
    hbar = Scrollbar(fen1, orient=HORIZONTAL, command=tree.xview)
    tree.configure(xscrollcommand=hbar.set)
    hbar.grid(row=3, column=0, columnspan=3, rowspan=3, sticky=EW)
     
     
     
    def view_command():
            for row in database.view():
                tree.insert("", END, values=(row[0], row[1], row[2], row[3], row[4], row[5], row[6]))

    Merci encore de votre patience

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

Discussions similaires

  1. connexion SQL serveur à eclipse?
    Par makaphrodite dans le forum JDBC
    Réponses: 5
    Dernier message: 15/08/2007, 02h29
  2. connexion à sql serveur
    Par new_wave dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/10/2006, 11h29
  3. Connexion SQL serveur et Centura team developer
    Par kenzi dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 16/03/2006, 09h28
  4. Connexion SQL serveur à WinDev
    Par stkam dans le forum WinDev
    Réponses: 2
    Dernier message: 29/03/2005, 09h54
  5. connexion sql serveur
    Par DiJiRiDouS dans le forum ASP
    Réponses: 10
    Dernier message: 16/09/2003, 17h14

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