Tkinter:从Entry小部件获取数据

3
我正在使用Python 2.7进行工作。这是一个较长程序的初始部分。我想要做的是添加一个新的用户名,以及他的身高和体重。我使用一个.txt文件来存储用户数据,
例如userlist3.txt:
add_new_user 1 1

unknown_user 170 70

monthy 185 83

[empty line]

This is the 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

它可以与已经存在于txt文件中的用户一起使用,但如果我想添加一个新用户,则无法使用。当我尝试时,在shell上打印出'PY_VAR0 0 0',并在txt文件中添加了'' 0 0的新行。显然,这些数据在软件的后续步骤中没有用处。我可能错过了某个.get()。

有人说,使用两个主循环不好: add_user = Toplevel(master) - thinker3
太棒了!我不知道这个谚语,我会记住的 :-D - user2750495
@user2750495 你还卡在那里吗?或者修复双主循环解决了你的问题吗? - Fiver
@Fiver:metaphy在评论中提供的解决方案完美地运行了,但由于它不是一个答案,我无法投票!到目前为止我还没有尝试Bryan的。 - user2750495
@user2750495 很好,很高兴你解决了问题。请记住,你可以随时回答自己的问题并接受它。这将防止其他人继续回答并帮助那些寻找类似问题解决方案的人。 - Fiver
2个回答

0
当你看到像PY_VAR0这样的东西时,这意味着你正在打印出一个StringVar(或IntVar或其他变量)的实例,而不是打印出变量的值。如果你正在使用其中的一个特殊变量,你必须调用get()方法来获取值。
在你的具体情况下,改变这个:
print name, width, height

转换为这个:

print name.get(), width, height

0
感谢Fiver的建议! metaphy的解决方案可行,我通过修改第28行来解决了问题:

add_user = Toplevel(user_list)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接