将Tkinter Entry变量传递给函数

时间:2015-11-10 18:51:56

标签: tkinter

我正在尝试学习如何将输入到一些输入字段的数据保存到文本文件中,但我显然遗漏了一些东西。我创建了一个打印按钮来打印这些变量,所以我可以测试,但只能获得PY_VAR0,PY_VAR1和PY_VAR2。我错过了什么?为什么firstName,lastName和userAge变量没有传递给函数?

提前致谢:-)

这是我的代码:

from tkinter import *
from tkinter import ttk

# Function to exit app **********************************************************
def callbackExit():
    root.destroy()
# End of Function to exit app ***************************************************

# Function to save entries to file **********************************************
def callbackSaveToFile():
    fileName = 'data.txt'
    target = open (fileName, 'w')
    target.write(firstName)
    target.write(lastName)
    target.write(userAge)
    target.close()
# End of Function to save entries ***********************************************

def testPrint():
    print(firstName)
    print(lastName)
    print(userAge)



root = Tk()
root.config(height = 480, width = 640)
root.title('Name and Age App v.1.0')
root.resizable(False, False)

firstName = StringVar()
lastName = StringVar()
userAge = IntVar()

ttk.Label(root, text = 'First Name: ').place(x=20, y=20)
ttk.Entry(root, width = 30, textvariable = firstName).place(x=115, y=20)
ttk.Label(root, text = 'Last Name: ').place(x=20, y=50)
ttk.Entry(root, width = 30, textvariable=lastName).place(x=115, y=50)
ttk.Label(root, text = 'Age: ').place(x=20, y=80)
ttk.Entry(root, width = 3, textvariable=userAge).place(x=115, y=80)


buttonExitApp = ttk.Button(root, text = 'Exit', command=callbackExit).place(x=500, y=350)
buttonSaveData = ttk.Button(root,text = 'Save', command=callbackSaveToFile).place(x=400, y=350)
buttonTestPrint = ttk.Button(root, text = 'Print', command=testPrint).place(x=20, y=350)

root.mainloop()

Results of Print button

3 个答案:

答案 0 :(得分:1)

对于textvariable对象,使用class set和get方法很重要。这里有一个很好的例子:

http://effbot.org/tkinterbook/entry.htm

我相信如果你打电话

target.write(firstname.get())

和您的其他变量类似,您的代码应按预期工作。

答案 1 :(得分:1)

我建议不要使用textvariable选项。在大多数情况下,它要求您管理您根本不需要的其他对象。

没有textvariable的解决方案

条目小部件有一个get()方法,可以获取该值。这与get()变量上的StringVar()方法完全相同,但适用于您已有的对象。

但是,这需要您保存对条目小部件的引用,因此第一步是更改您创建小部件的方式:

firstNameLabel = ttk.Label(root, text = 'First Name: ')
firstNameEntry = ttk.Entry(root, width = 30, textvariable = firstName)
lastNameLabel = ttk.Label(root, text = 'Last Name: ')
lastNameEntry = ttk.Entry(root, width = 30, textvariable=lastName)
userAgeLabel = ttk.Label(root, text = 'Age: ')
userAgeEntry = ttk.Entry(root, width = 3, textvariable=userAge)

firstNameLabel.place(x=20, y=20)
firstNameEntry.place(x=115, y=20)
lastNameLabel.place(x=20, y=50)
lastNameEntry.place(x=115, y=50)
userAgeLabel.place(x=20, y=80)
userAgeEntry.place(x=115, y=80)

将窗口小部件创建与窗口小部件布局分离是最佳实践,可以更容易地可视化和修改布局。

(另外,我强烈鼓励您学习packgrid。他们需要的工作量要少得多,并且通常会产生对调整大小和不同系统上的不同字体。)

接下来,您可以调用Entry小部件的get方法:

def testPrint():
    print(firstNameEntry.get())
    print(lastNameEntry.get())
    print(userAgeEntry.get())

使用textvariables的解决方案

如果您想使用textvariables,解决方案是类似的。您不必直接访问变量值(这就是为什么要获得PY_VAR0等),而是必须在变量上调用get()方法:

def testPrint():
    print(firstName.get())
    print(lastName.get())
    print(userAge.get())

答案 2 :(得分:0)

def中使用它

def something():
    global var1
    global var2 
    global var3

那么你可以开始,因为dwf正在寻找局部变量,所以你必须让它为def的全局变量,你必须用你的每个def做到这一点