Afficher le resultat d'une bd pydblite dans un label

Résolu
pascal128 Messages postés 21 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 4 septembre 2022 - 19 nov. 2015 à 19:22
pascal128 Messages postés 21 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 4 septembre 2022 - 30 déc. 2015 à 19:10
Bonjour
J'ai toujours un peu de mal avec tkinter, en effet j'ai ici un code qui fonctionne, mais je cale sur l'affichage du resultat 'TEL' dans le label apres avoir renseigné le nom dans 'entry.
Le resultat print est bon , mais j'ai du mal a ecrire pour tkinter cette partie de code ** for rec in db(nom='martin'):
print(rec['tel']) **
quelqu'un aurait-il quelques explications pour me remettre sur les rails
Merci par avance.

from tkinter import *
fen = Tk()

def pydblite():
from pydblite.pydblite import Base
# lecture du contenu de la base
db = Base('numtel.pdl')
# champs nom, taille
if db.exists():
db.open()

# affiche que ce que l on demande
# le resultat print est bon, mais je ne vois pas par ou commencer
#pour entrer le nom dans "nom_entry" et recuperer l'info de la base dans le label.
for rec in db(nom='martin'):
print(rec['tel'])


# nom de la personne que l on recherche
frame1 = Frame(fen,borderwidth=2,relief=GROOVE)
frame1.pack(side=LEFT,padx=10,pady=10)

F1 = LabelFrame(frame1, text = "NOM", labelanchor= N)
F1.pack(side=LEFT, padx =10, pady = 10)


# reponse - numero de tel correspondant au nom prenom
frame2 = Frame(fen,borderwidth=2,relief=GROOVE)
frame2.pack(side=LEFT,padx=10,pady=10)

F2 = LabelFrame(frame2, text = "TEL", labelanchor= N)
F2.pack(side=LEFT,padx =10, pady = 10)


nom_entry=Entry(F1, bd=5).pack(side=LEFT)

tel_label=Label(F2, bd=5).pack(side=LEFT)

fen.mainloop()

4 réponses

Mints Messages postés 69 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 1 juin 2018 7
Modifié par Mints le 19/11/2015 à 23:36
Salut, si vous souhaitez mettre à jour un widget label après sa création, utilisez la méthode 'configure' sur celui-ci et indiquez que vous voulez modifier l'option de texte :
label = Label(fenetre,text='texte1')
label.configure(text='texte2')

Si vous voulez mettre un widget Entry à jour il faut déjà supprimer ce qu'il y a dedans et insérer le nouveau 'texte' depuis le début :
entree = Entry(fenetre)
entree.delete(0,END)
entree.insert(0,'texte')


--
0
pascal128 Messages postés 21 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 4 septembre 2022 1
21 nov. 2015 à 11:55
Bonjour à tous
J ai corrigé mon sujet, j'ai rajouté un peu d'esthétique, apres avoir indiqué le nom de "dupond" dans dans " l'entree nom" puis une action sur "enter" je devrais avoir le numero de tel dans le label. c'est le que ca gate. je n'ai toujour pas compris comment rediger le code for rec in db(nom='martin'): --> print(rec['tel']) sous tkinter. Voici mon code relooké.
from tkinter import *
fen = Tk()

def pydblite():
from pydblite.pydblite import Base
# lecture du contenu de la base
db = Base('numtel.pdl')
# champs nom, taille
if db.exists():
db.open()

# la requette - elle fonctionne fonctionne
for rec in db(nom=''):
print(rec[''])


def quitter():
fen.destroy()


# ------------------------------------------------------------------------------
frame_nom = LabelFrame(fen, text = "NOM", labelanchor= N)
frame_nom.pack(padx =10, pady = 10, side=LEFT)

frame_tel= LabelFrame(fen, text = "TEL", labelanchor= N)
frame_tel.pack(padx =10, pady = 10, side=LEFT)
#
entree_nom=Entry(frame_nom, bd=5)
entree_nom.delete(0,END)
entree_nom.insert(0,'')
entree_vol.bind("<Return>", pydblite) # le code plante a partir d ici
# en effet encore compris comment ecrire la requette -
entree_nom.pack()

label_tel=Label(frame_tel, text=['tel'])
label_tel.configure(text='')
label_tel.pack()

# ------------------------------------------------------------------------------
bouton_quit=Button(fen, text='Quit', command=quitter).pack(side=BOTTOM)

# ------------------------------------------------------------------------------
fen.minsize(200,200)
fen.mainloop()
0
pascal128 Messages postés 21 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 4 septembre 2022 1
22 nov. 2015 à 11:54
Bonjour
J'ai avancé un petit peu dans le code mais il doit me manquer quelque chose pour le terminer. Voici le message que j'obtiens à la fin. Merci d'avance pour l'aide.

>>> Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python33\lib\tkinter\__init__.py", line 1489, in __call__
return self.func(*args)
TypeError: pydblite() takes 0 positional arguments but 1 was given

Voici mon code
from tkinter import *
fen = Tk()

def pydblite():
from pydblite.pydblite import Base
# lecture du contenu de la base
db = Base('numtel.pdl')
# champs nom, taille
if db.exists():
db.open()

# la requette - elle fonctionne fonctionne
for rec in db(nom=''):
print(rec['tel'])


nom = StringVar()
tel = StringVar()
# ------------------

def quitter():
fen.destroy()

# ------------------------------------------------------------------------------
# frame
frame_nom = LabelFrame(fen, text = "NOM", labelanchor= N)
frame_nom.pack(padx =10, pady = 10, side=LEFT)

frame_tel= LabelFrame(fen, text = "TEL", labelanchor= N)
frame_tel.pack(padx =10, pady = 10, side=LEFT)
#
# entree nom
entree_nom=Entry(frame_nom, textvariable = nom, bd=5)
entree_nom.delete(0,END)
entree_nom.insert(0,'')
entree_nom.bind("<Return>", pydblite)
entree_nom.pack()
#
# label reponse tel apres action sur la touche ENTER
label_tel=Label(frame_tel, textvariable = tel)
label_tel.configure(textvariable='')
label_tel.pack()

# ------------------------------------------------------------------------------
bouton_quit=Button(fen, text='Quit', command=quitter).pack(side=BOTTOM)

# ------------------------------------------------------------------------------
fen.minsize(200,200)
fen.mainloop()
0
Mints Messages postés 69 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 1 juin 2018 7
Modifié par Mints le 22/11/2015 à 17:20
Bonjour,

Si vous liez un événement utilisateur sur une méthode :
entree_nom.bind("<Return>", pydblite)

vous devez rajouter 'event' en argument de cette méthode

def pydblite(event):
    # reste de la méthode

Ceci explique le message d'erreur car l'appuie sur la touche entrée envoie une instance d'événement utilisateur à votre méthode qui n'est pas censé en recevoir.

Ensuite si vous utilisez des variables Tkinter, vous pouvez interagir sur celle-ci via 2 méthodes :
var = StringVar()
var.set(texte) : attribue la chaine 'texte' à votre variable tkinter ce qui mettra automatiquement à jour le label contenant cette variable pour peu que vous ayez configurez le label en ce sens :
label_tel=Label(frame_tel, textvariable = tel) (ce que vous avez fait)

var.get() : renvoie la valeur de la chaine contenue dans cette variable

Donc je pense que votre fonction devrait ressembler à ceci :

def pydblite(event):
    # lecture du contenu de la base
    db = Base('numtel.pdl')
    # champs nom, taille
    if db.exists():
        db.open()

    # la requette - elle fonctionne fonctionne
    for rec in db(nom=nom.get()):
        print(rec['tel'])
        tel.set((rec['tel']))


Vous pouvez aussi supprimer les lignes inutiles dans votre cas :
entree_nom.delete(0,END)
entree_nom.insert(0,'')
label_tel.configure(textvariable='')

Rassemblez les imports de modules au début du code, suivi des méthodes.
Évitez de déclarer des variables entre 2 définitions de méthode.
Finissez par rassembler la définition de votre interface en commençant par fen = Tk() suivi de tous les widgets.

J'espère que cela fonctionnera mieux, tenez moi au courant.
0
pascal128 Messages postés 21 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 4 septembre 2022 1 > Mints Messages postés 69 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 1 juin 2018
23 nov. 2015 à 11:36
Bonjour Mints
Super sympa pour les infos, je vais etudiers toutes ces explications, faire chauffer Pyscripter pour comprendre et avancer tout seul. Si je bloque je vous recontacte, je vous tient au courant.
Bonne journée, la mienne n'a pas encore commencée.
p128
encore merci
0
pascal128 Messages postés 21 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 4 septembre 2022 1
27 nov. 2015 à 12:03
Bonjour
J'ai organisé mon programme comme il le faut, je pense, mai je n'arrive toujours pas "a me connecter a la base" alors que j'obtiens une bonne reponse avec ce petit code
    for rec in db(nom='dupond'):
print(rec['tel'])


Voici ou j'en suis, je bloque toujours sur " recuperer l'info dans la base pydblite et afficher la reponse dans le label 'tel'
merci de votre aide.

# modules
from tkinter import *

# methodes
def pydblite(event):
from pydblite.pydblite import Base
# lecture du contenu de la base - champs nom , tel
db = Base('numtel.pdl')
if db.exists():
db.open()
for rec in db(nom=msg_nom.get()):
print(msg_tel.get((rec['tel'])))


# #
def quitter():
fen.destroy()
def resultat():
entree_nom.bind("<Return>", pydblite)
return msg_tel.get()

msg_nom = StringVar()
msg_tel = StringVar()

# prog
fen = Tk()

# frame
frame_nom = LabelFrame(fen, text = "NOM", labelanchor= N)
frame_nom.pack(padx =10, pady = 10, side=LEFT)

frame_tel= LabelFrame(fen, text = "TEL", labelanchor= N)
frame_tel.pack(padx =10, pady = 10, side=LEFT)
#
# entree nom
entree_nom=Entry(frame_nom, textvariable = msg_nom, bd=5)
entree_nom.bind("<Return>", pydblite)
entree_nom.pack()
#
# label reponse tel apres action sur la touche ENTER
label_tel=Label(frame_tel, textvariable = msg_tel)
label_tel.pack()
#
# bouton quit
bouton_quit=Button(fen, text='Quit', command=quitter).pack(side=BOTTOM)

# ------------------------------------------------------------------------------
fen.minsize(200,200)
fen.mainloop()
0
Mints Messages postés 69 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 1 juin 2018 7
27 nov. 2015 à 16:21
Bonjour pour modifier une StringVar vous devez utiliser la méthode set() et non get() qui elle vous renvoie son contenue.
Dans votre cas vous voulez changer le texte du label label_tel avec le téléphone correspondant au nom entré dans l'entry entree_nom.Vous devrez donc utiliser la méthode de modification set() et non pas get() sur la StringVar du label:


   for rec in db(nom=entree_nom.get()):
        print(rec['tel'])
        label_tel.set((rec['tel']))
0
pascal128 Messages postés 21 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 4 septembre 2022 1 > Mints Messages postés 69 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 1 juin 2018
29 déc. 2015 à 23:45
Bonjour
J'ai bien avancé dans le script, il y a du resultat.
En tapant milou dans "l'entry" j'obtient la bonne reponse de ma base pydblite = 88, dans le label. ( resultat des prints=
>>>
verif_1 88
verif_2 milou
verif_3 88
>>>
j'ai rajouté un bouton "clear" pour effacer l'entry et le label. le probleme et que j'arrive à reseter "l'entry" avec "msg_tel.delete(0.END) ou "label_tel.delete(0.END)". j'obtient ce message = msg.tel.delete(0,END)
NameError: name 'msg' is not defined
voici mon code
merci de votre aide
et bonnes fetes de fin d'année
# modules ----------------------------------------------------------------------
from tkinter import *

# methodes ---------------------------------------------------------------------
def pydblite(event):
from pydblite.pydblite import Base
# lecture du contenu de la base - champs nom , tel
db = Base('numtel.pdl')
if db.exists():
db.open()
for rec in db(nom=entree_nom.get()):
msg_tel.set((rec['tel']))
print("verif_1",rec['tel'])
print("verif_2",entree_nom.get())
print("verif_3",msg_tel.get())
# #
def quitter():
fen.destroy()
def resultat():
entree_nom.bind("<Return>", pydblite)
def nettoyage():
entree_nom.delete(0,END)
msg.tel.delete(0,END)


# prog -------------------------------------------------------------------------
fen = Tk()

# frame
frame_nom = LabelFrame(fen, text = "NOM", labelanchor= N)
frame_nom.pack(padx =10, pady = 10, side=LEFT)

frame_tel= LabelFrame(fen, text = "TEL", labelanchor= N)
frame_tel.pack(padx =10, pady = 10, side=LEFT)
#
# entree nom
msg_nom = StringVar()
entree_nom=Entry(frame_nom, textvariable = msg_nom, bd=5)
msg_nom.set("")
entree_nom.bind("<Return>", pydblite)
entree_nom.pack()
#
# label reponse tel apres action sur la touche ENTER
msg_tel= StringVar()
label_tel=Label(frame_tel,textvariable = msg_tel)
label_tel.pack()
msg_tel.set("")
#
# bouton quit
bouton_quit=Button(fen, text='Quit', command=quitter).pack(side=BOTTOM)
bouton_clear=Button(fen,text="clear",command=nettoyage).pack()
# ------------------------------------------------------------------------------
fen.minsize(220,220)
fen.mainloop()
0
Mints Messages postés 69 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 1 juin 2018 7 > pascal128 Messages postés 21 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 4 septembre 2022
30 déc. 2015 à 12:02
Bonjour,

au lieu de msg.tel.delete(0,END) vous vouliez surement écrire msg_tel.delete(0,END). Puisque vous utilisez des StringVar je vous conseille de les mettre à jour plutot que d'effacer leur widget associé(entree_nom,label_tel) en écrivant dans votre méthode d’effacement msg_nom.set('') et msg_tel.set('').

Aussi n'importez pas le module de base de données à chaque recherche, placez-le après l'import de tkinter et initialisez votre variable 'db' contenant votre base entre la définition des méthodes et la création de l'interface. Prévoyez peut-être le cas où le fichier n'est pas présent...
if db.exists():
    db.open()
else:
    ...


Vous pouvez aussi renommer votre fonction de recherche 'recherche' en prenant soin de modifier la liaison de la touche entrer sur cette fonction. Profitez-en pour prévoir les cas qui lèvent des exceptions quand un nom n'est pas présent dans la base par exemple en utilisant la combinaison des mots clé 'try' et 'else'(on tente d’exécuter les instructions placées après le 'try', si cela lève une exception on exécute les instructions placées après le 'else')

def recherche(event):
    try:
        for rec in db(nom=entree_nom.get()):
            msg_tel.set((rec['tel']))
    else:
        return


Bonnes fêtes.
0
pascal128 Messages postés 21 Date d'inscription mercredi 4 décembre 2013 Statut Membre Dernière intervention 4 septembre 2022 1 > Mints Messages postés 69 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 1 juin 2018
30 déc. 2015 à 19:10
Bonsoir (19h00)
Super chef
ca fonctionne comme je le voulais
Il me reste a integrer
if db.exists():
db.open()
else:
...
Je vais essayer avec 2 lignes de "nom +tel + bouton clear"
Merci encore
Bonne fin d'année
0
Rejoignez-nous