3 votes

Tkinter : récupérer les données d'un widget Entry

Je travaille avec Python 2.7. Il s'agit de la partie initiale d'un programme plus long. Ce que je veux faire est d'ajouter un nouveau nom d'utilisateur, ainsi que sa taille et son poids. J'utilise un fichier .txt pour stocker les données de l'utilisateur,

exemple userlist3.txt :

add_new_user 1 1

unknown_user 170 70

monthy 185 83

[empty line]

Voici le code :

from Tkinter import *
user_list = Tk()
user_list.title('Users')

def add_new_user():
    global select
    global height
    global weight 
    select = name.get()
    height = h.get()
    weight = w.get()   
    f = ' '
    us=open("userlist3.txt","a")
    print name, height, weight
    us.write(select + f + str(height) + f + str(weight) + "\n")
    us.close()
#    add_user.destroy() # it doesn't work
    user_list.destroy()

def onSelect(ev): # (10)
    global select
    select=listb.get(listb.curselection()) # (12)
    lab.configure(text=select) # (14)
    global name
    global h
    global w
    if select == 'add_new_user':
        add_user = Tk()
        add_user.title('New user')
        a=Label(add_user,text="Your username").pack()
        name = StringVar()
        NAME = Entry(add_user,textvariable = name).pack()
        b=Label(add_user,text="Your height (in cm)").pack()    
        h = IntVar()
        H = Entry(add_user,textvariable = h).pack()
        c=Label(add_user,text="Your weight (in kg)").pack()
        w = IntVar()
        W = Entry(add_user,textvariable = w).pack()
        Add_New_User=Button(add_user,text="Add new user data",command=add_new_user).pack()
        add_user.mainloop()
    else:
        user_list.destroy()

a=open("userlist3.txt","r")
b =[]
for linea in a:
    b.append(linea)
a.close()
e = []
for i in range(len(b)):
    e.append(b[i].split())
userlist = []
heightlist = []
weightlist = []
for i in range(len(e)):
    userlist.append(e[i][0])
    heightlist.append(e[i][1])
    weightlist.append(e[i][2]) 

sbar = Scrollbar(user_list, orient=VERTICAL) # (20)
listb = Listbox(user_list, width=30, height=4) # (22)
sbar.config(command=listb.yview) # (30)
listb.config(yscrollcommand=sbar.set) # (32)
sbar.pack(side=RIGHT, fill=Y) # (40)
listb.pack() # (42)
lab=Label(user_list,text="Double Click on User") # (50)
lab.pack()
for c in userlist: listb.insert(END,c)
listb.bind('<Double-1>',onSelect) # (70)
user_list.mainloop()

for d in range(1,len(userlist)):
    if userlist[d] == select:
        height = int(heightlist[d])
        weight = int(weightlist[d])

print "Selected user is: ",select
print height
print weight

Cela fonctionne avec les utilisateurs déjà présents dans le fichier txt, mais pas si je veux en ajouter un nouveau. Lorsque j'essaie, j'obtiens 'PY_VAR0 0 0' imprimé sur la coquille et '' 0 0 ajouté dans une nouvelle ligne dans le fichier txt. Évidemment, ces données ne sont d'aucune utilité pour les étapes suivantes de mon logiciel. .get() quelque part.

0voto

Bryan Oakley Points 63365

Quand vous voyez quelque chose comme PY_VAR0 cela signifie que vous imprimez l'instance d'un StringVar (ou IntVar ou autre), plutôt que d'imprimer le nom de l'instance. valeur de la variable. Si vous utilisez l'une des variables spéciales, vous devez appeler la fonction get() pour obtenir la valeur.

Dans votre cas spécifique, changez cela :

print name, width, height

A ceci :

print name.get(), width, height

0voto

user2750495 Points 49

Merci Fiver pour vos conseils ! La solution de metaphy fonctionne, j'ai résolu le problème en modifiant la ligne 28 dans

add_user = Toplevel(user_list)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X