2017-05-06 22 views
0

我是初学者。我已经尝试了一切,以使下面的代码将数字输入输入到输入框中,并使用它们进行计算。我得到了ValueError,我没有做任何事情让这种停止发生。这应该是一个计算每月利息支付和支出总额的计划。我把它放在一个简单的产品上,直到我解决这个更基本的问题。谢谢。将tkinter输入框的值变成浮点数(python)

def multiply(var1, var2, var3): 
    product = float(var1 * var2 * var3) 
    return product 


def btnClick(event): 
    x = float(entry.get()) 


main = Tk() 
main.title("Assignment 16") 

main.geometry("500x500") 
main["bg"] = "#000066" 

lblFirst = Label(main, text="Amount to Pay: ") 
lblFirst.grid(row=0, column=3, pady=5) 
entry = Entry(main, width=20) 
entry.grid(row=0, column=4) 
amount = entry.get() 
lblSecond = Label(main, text="Interest Rate (like 7.5): ") 
lblSecond.grid(row=2, column=3, pady=10) 
entry2 = Entry(main, width=20) 
entry2.grid(row=2, column=4) 
rate = entry2.get() 
lblThird = Label(main, text="Years to Pay: ") 
lblThird.grid(row=4, column=3, pady=15) 
entry3 = Entry(main, width=20) 
entry3.grid(row=4, column=4) 
years = entry3.get() 

try: 
    # Try to make it a float 
    if amount.isnumeric(): 
     amount = float(amount) 

except ValueError: 
    # Print this if the input cannot be made a float 
    print("Bad input") 

try: 
    # Try to make it a float 
    if rate.isnumeric(): 
     rate = float(rate) 

except ValueError: 
    # Print this if the input cannot be made a float 
    print("Bad input") 

try: 
    # Try to make it a float 
    if years.isnumeric(): 
     years = int(years) 

except ValueError: 
    # Print this if the input cannot be made a float 
    print("Bad input") 

lblFourth = Label(main, text="Monthly Payment: ") 
lblFourth.grid(row=6, column=3, pady=15) 
lblFourthTwo = Label(main, text="XXXXX") 
lblFourthTwo.grid(row=6, column=4) 
lblFifth = Label(main, text="Total of Paymenta: ") 
lblFifth.grid(row=8, column=3, pady=15) 
lblFifthTwo = Label(main, text="XXXXX") 
lblFifthTwo.grid(row=8, column=4) 

button1 = Button(main, text='Convert', width=10, command=btnClick) 
button2 = Button(main, text='Calculate', width=10, command=multiply(amount, rate, years)) 
button1.grid(padx=20, pady=20) 

main.mainloop() 
+0

在哪条线上抛出错误? –

+0

第一次演员正在抛出浮动。但我知道了。所以感谢您花时间回复。我知道我必须努力学习。至少这次我做了它的工作。 – user3527876

回答

1

你所有的代码运行之前mainloop开始。

使用GUI工具包(如tkinker)的程序是事件驱动的。您的代码只有在主循环之前在设置中运行,然后在事件处理程序中运行。

您可以使用验证来确保只输入数字。

下面的工作示例(用于Python 3)。这也显示了如何从事件处理程序中的编辑框中获取值以及如何创建合成事件来更新其他小部件。

import tkinter as tk 
from tkinter import ttk 

# Creating and placing the widgets 
root = tk.Tk() 
root.wm_title('floating point entry') 
qedit = ttk.Entry(root, justify='right') 
qedit.insert(0, '100') 
qedit.grid(row=0, column=0, sticky='ew') 
result = ttk.Label(root, text='100') 
result.grid(row=1, column=0) 
ttk.Button(root, text="Exit", command=root.quit).grid(row=2, column=0) 


# Callback functions 
def is_number(data): 
    if data == '': 
     return True 
    try: 
     float(data) 
     print('value:', data) 
    except ValueError: 
     return False 
    result.event_generate('<<UpdateNeeded>>', when='tail') 
    return True 


def do_update(event): 
    w = event.widget 
    number = float(qedit.get()) 
    w['text'] = '{}'.format(number) 

# The following settings can only be done after both the 
# widgets and callbacks have been created. 
vcmd = root.register(is_number) 
qedit['validate'] = 'key' 
qedit['validatecommand'] = (vcmd, '%P') 
result.bind('<<UpdateNeeded>>', do_update) 

# Run the event loop. 
root.mainloop() 
+0

谢谢。我发布后几个小时才开始工作。我很感激这个输入,并将保留代码供将来参考。 – user3527876