Python - tkinter中的IntVar / entry只返回0

时间:2016-04-29 15:25:52

标签: python user-interface tkinter

我正在尝试编写一个程序来进行计算和求解方程式,使用由tkinter制作的gui,并且已经达到了放入已知值的程度。这些值是在tkinter的条目小部件中输入的(我使用的是IntVar(),而不是StringVar(),所以这不是问题),但由于某种原因,无论我输入的值是什么,它都只返回0.代码如下:

def getvalues_1dk():
    getvalues2frame = ttk.Frame(calculations_root, width=100, height=100, padding="5")
    getvalues2frame['borderwidth'] = 3
    getvalues2frame['relief'] = 'raised'
    getvalues2label = ttk.Label(getvalues2frame, text="Step 5: Enter a value for each of the variables you\n"
                                                      " selected in step 4.")
    getvalues2label.grid(row=1, column=1, sticky=(N, W))
    getvalues2frame.grid(row=0, column=0, sticky=E)
    getvalue1(getvalues2frame)
    return getvalues2frame

def getvalue1(getvalues2frame):
    if known1d1.get() and known1d2.get() and known1d3.get():
        known1d1entryvar = IntVar()
        known1d1entry = ttk.Entry(getvalues2frame, textvariable=known1d1entryvar)
        ttk.Label(getvalues2frame, text=known1d1.get()).grid(row=2, column=1, sticky=W)
        known1d1entry.grid(row=2, column=1, sticky=E)
        ttk.Button(getvalues2frame, text="Confirm",
                   command=(getvalue2(getvalues2frame, known1d1entryvar))).grid(row=3, column=1,
                                                                                sticky=E)
        return known1d1entryvar

def getvalue2(getvalues2frame, known1d1entryvar):
    if known1d1entryvar.get():
        known1d2entryvar = IntVar()
        known1d2entry = ttk.Entry(getvalues2frame, textvariable=known1d2entryvar)
        ttk.Label(getvalues2frame, text=known1d2.get()).grid(row=4, column=1, sticky=W)
        known1d2entry.grid(row=4, column=1, sticky=E)
        ttk.Button(getvalues2frame, text="Confirm",
                   command=(getvalue3(getvalues2frame, known1d1entryvar, known1d2entryvar))).grid(row=5, column=1,
                                                                                                  sticky=E)
        return known1d2entryvar

def getvalue3(getvalues2frame, known1d1entryvar, known1d2entryvar):
    if known1d2entryvar.get():
        known1d3entryvar = IntVar()
        known1d3entry = ttk.Entry(getvalues2frame, textvariable=known1d3entryvar)
        ttk.Label(getvalues2frame, text=known1d3.get()).grid(row=6, column=1, sticky=W)
        known1d3entry.grid(row=6, column=1, sticky=E)
        calculatebutton = ttk.Button(getvalues2frame, text="Show formula and calculate",
                                     command=(
                                         calculate1d(known1d1entryvar, known1d2entryvar, known1d3entryvar,
                                                     solveforvar1d, unusedvar1d)))
        calculatebutton.grid(row=7, column=1, sticky=E)

def calculate1d(known1d1entryvar, known1d2entryvar, known1d3entryvar, solveforvar1d, unusedvar1d):
    if known1d1entryvar.get() and known1d2entryvar.get() and known1d3entryvar.get():
        knownvar1 = known1d1entryvar.get()
        knownvar2 = known1d2entryvar.get()
        knownvar3 = known1d3entryvar.get()
        print(knownvar1, knownvar2, knownvar3)
        solveforvar1d = Symbol(solveforvar1d)
        print(solveforvar1d)
        print(unusedvar1d)

这部分代码应该1)创建一个标记的框架,其中输入值,2)为第一个已知变量的整数值创建一个输入框,并使用一个按钮来确认该值并创建下一个输入框,3)按下按钮时创建下一个输入框,4)创建另一个按钮以确认第二个值并创建下一个输入框,5)按下按钮时创建第三个输入框,并创建另一个按钮来运行function calculate1d(),它当前是一个占位符,用于查看程序是否返回正确的值。

然而,它不起作用。现在,代码在创建第一个值的输入框并创建按钮以确认并创建第二个输入框和按钮后停止。使用此代码,我无法确切地看到输入框返回的值。但是我尝试将print(known1d1entryvar.get())放在getvalue2()的开头,看看它返回的是什么值,无论我输入什么值,它都返回0.此外,它打印了值0,当在第一个输入框中输入数字并按下第一个按钮后,我按下了调用getvalues_1dk()功能的按钮(未显示),而不是我想要的按钮。

请帮帮我。我已经被困在这两天了,我已经尝试了我能想到的一切。

编辑:如有必要,我可以在粘贴网站上发布我的整个源代码。只要有必要就问。

1 个答案:

答案 0 :(得分:0)

ttk条目小部件比tk条目wigets更容易受到垃圾收集的影响。您正在为IntVar使用局部变量。你需要确保那些没有收集垃圾。更好的是,根本不要使用它们。

大多数情况下,使用StringVar和/或IntVar完全不需要使用Entry小部件。如果没有它们,您可以将值放入并从窗口小部件中获取值。它们只是添加了一个必须维护的额外对象而没有给出任何实际好处。它们唯一有用的是,如果您对多个小部件使用相同的变量,或者在变量上放置跟踪。