Python自定义公式计算器

时间:2017-09-28 12:46:09

标签: python python-2.7 tkinter

我刚刚开始学习python而且我喜欢这种语言,更容易理解我过去尝过的其他人,就是说我已经在墙上撞了几天了。< / p>

我正在尝试编写自定义公式python calc。到目前为止,我有:

from Tkinter import *
from math import *
def printAll():
    printMoneyIn()
    printMoneyOut()

def printMoneyIn():
    Label(master, text= "money in = \n" u"\xA3").grid(row=7, column=0)
def printMoneyOut():
    Label(master, text = "money out", sum = (e1 + e2 * e3 + e4)).grid(row=8)

master = Tk()
v = IntVar()
formula1 = e1*e2*e3+e4
formula2 = e1+e2+e3+e4

e1 = Entry(master)
e2 = Entry(master)
e3 = Entry(master)
e4 = Entry(master)

def getFloats():
    val1 = float (e1.get())
    val2 = float (e2.get())
    val3 = float (e3.get())
    val4 = float (e4.get())

Radiobutton(master, text="without", padx = 10, width = 10, variable=v, value=1, indicatoron=0).grid(row=1, column=0)
Radiobutton(master, text="with", padx = 10, width = 10, variable=v, value=2, indicatoron=0).grid(row=1, column=1)
Label(master, text="money in", padx=20, width=10, bg = "light blue").grid(row=3)
Label(master, text="times by", padx=20, width=10, bg = "light blue").grid(row=4)
Label(master, text="times by", padx=20, width=10, bg = "red").grid(row=5)
Label(master, text="money out", padx=20, width=10, bg = "red").grid(row=6)
Label(master).grid(row=7, column=0)

# automatically adds the value 5 to money out
e4.insert(10,"5")

e1.grid(row=3, column=1)
e2.grid(row=4, column=1)
e3.grid(row=5, column=1)
e4.grid(row=6, column=1)
Button(master, text='Show', command=printAll, width=20).grid(row=7, column=1, sticky=W, pady=4)
Label(master).grid(row=7, column=0)
Label(master).grid(row=8)
master.mainloop()

我的目标是:

  • 在输入框中添加值。
  • 确定选择哪个单选框以确定公式。
  • 在输入框中的数字上运行公式。
  • 在底部显示结果。

无论我尝试什么,我似乎无法让数字相互交互。

我正在搜索互联网并且比我开始时更加困惑。如果有人能指出我正确的方向,那么我可以继续学习这门语言。

感谢您的帮助。

罗布

1 个答案:

答案 0 :(得分:0)

您的代码中有一些事情会导致它无法正常工作。

即使代码的printMoneyIn()printMoneyOut()部分有效,每次按下显示按钮时,它们都会叠加标签。相反,您应该在init上创建标签,然后在按show时更新该标签。请注意,两个标签都会失败,因为它们不是1个连续的字符串。如果要向字符串添加内容,可以使用.format()执行此操作。首先进行数学计算,然后将该值附加到文本字段。它应该更容易阅读。

将输入字段转换为浮点数时出现问题。如果输入字段为空或包含非数字值,则会出错。我们可以通过几种方法解决这个问题,但是现在我已经添加了一个for循环,它将在每个字段中放置零开始。但在此过程中,您应确保使用try/except语句或使用validation进行错误检查。

在python中编程时,您可以记住的另一件事是避免在导入时使用*。更准确地说,您要导入的内容或确保您不要通过定义唯一导入的内容来覆盖任何其他导入或内置方法。例如,您可以执行import tkinter as tk。这将允许您使用前缀为tk.的任何tkinters方法,而不会影响命名空间中的任何其他内容。

看看下面的代码。它并不完美,但它的清理有点功能。

import tkinter as tk


master = tk.Tk()
v = tk.IntVar()

def printAll():
    val1 = float(e1.get())
    val2 = float(e2.get())
    val3 = float(e3.get())
    val4 = float(e4.get())
    my_sum = (val1 + val2 * val3 + val4)
    lbl1.config(text = "money out = {}".format(my_sum))

tk.Radiobutton(master, text="without", padx = 10, width = 10, variable=v, value=1, indicatoron=0).grid(row=1, column=0)
tk.Radiobutton(master, text="with", padx = 10, width = 10, variable=v, value=2, indicatoron=0).grid(row=1, column=1)
tk.Label(master, text="money in", padx=20, width=10, bg = "light blue").grid(row=3)
tk.Label(master, text="times by", padx=20, width=10, bg = "light blue").grid(row=4)
tk.Label(master, text="times by", padx=20, width=10, bg = "red").grid(row=5)
tk.Label(master, text="money out", padx=20, width=10, bg = "red").grid(row=6)

# You need to assign your label widget to a variable name so you can update its text later.
lbl1 = tk.Label(master, text = "money out")
lbl1.grid(row=10)

e1 = tk.Entry(master)
e2 = tk.Entry(master)
e3 = tk.Entry(master)
e4 = tk.Entry(master)
e1.grid(row=3, column=1)
e2.grid(row=4, column=1)
e3.grid(row=5, column=1)
e4.grid(row=6, column=1)

# automatically adds zeros to all fields. Because you cannot convert blank fields to floats.
for entry in [e1, e2, e3, e4]:
    entry.insert(tk.END, "0") 

tk.Button(master, text='Show', command=printAll, width=20).grid(row=7, column=1, sticky=tk.W, pady=4)

master.mainloop()