2013-09-05 3 views
3

Я работаю с Python 2.7. Это начальная часть более длинной программы. Я хочу добавить новое имя пользователя вместе с высотой и весом. Я использую файл .txt для хранения пользовательских данных,Tkinter: получить данные из виджета ввода

userlist3.txt примера:

add_new_user 1 1 

unknown_user 170 70 

monthy 185 83 

[empty line] 

Это код:

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 

Он работает с пользователем уже присутствует в текстовом файле, но не если я хочу добавить новый. Когда я пытаюсь, я получил 'PY_VAR0 0 0', напечатанный на оболочке, и '' 0 0 добавлен в новую строку в txt-файле. Очевидно, что эти данные бесполезны на следующих этапах моего программного обеспечения. Возможно, у меня нет .get().

+0

ктото сказал, что это не хорошо использовать два mainloops: add_user = Toplevel (мастер) вместо – metaphy

+0

Fantastic! Я не знал этой пословицы, я буду иметь в виду это: -D – user2750495

+0

@ user2750495 Вы все еще застряли или исправили проблему с двумя главными решетками? – Fiver

ответ

0

Спасибо Fiver за ваши советы! Решение metaphy работает, я решил эту проблему, изменяющую линии 28 в

add_user = Toplevel (user_list)

0

Когда вы видите что-то вроде PY_VAR0, это означает, что вы распечатайте экземпляр STRINGVAR (или IntVar или любой другой), а не распечатав значение переменной. Если вы используете один из специальных варов, вы должны вызвать метод get(), чтобы получить значение.

В вашем конкретном случае, это изменить:

print name, width, height 

к этому:

print name.get(), width, height 
Смежные вопросы