首页 > 解决方案 > 如何根据输入字段的数据自动更新

问题描述

首先让我说我对编码非常陌生。我拼凑起来并编写了一些代码,根据输入到 3 个条目字段中的数据来评估一个方程。我有它,所以当我点击“计算”时,它会评估方程并给我一个答案。有没有办法让它自动计算,这样我就不必在每组条目后点击计算?理想情况下,用户只需按标签,输入数据,标签,输入数据,标签,输入数据,然后使用给出的答案。然后,他们将通过返回初始输入字段来重复该过程。

以下是我的代码的副本:

from tkinter import *
from math import *

def show_entry_fields():
     a, b, c = float(e1.get()), float(e2.get()), float(e3.get())
     s = (a + b + c) / 2
     height = (sqrt (s * (s - a) * (s - b) * (s - c)) * 2) / b
     height = float(format(height, '.3f'))
     height_label['text'] = str(height)
     side =(sqrt ((a ** 2) - (height ** 2)))
     side = float(format(side, '.3f'))
     side_label['text'] = str(side)

master = Tk()
master.attributes("-topmost", True)

Label(master, text="Measurement from nearest to 0+00").grid(row=5, column=0, sticky=W, pady=4)
e1 = Entry(master)
e1.grid(row=5, column=1, sticky=E)

Label(master, text="Distance between points on Station Line").grid(row=6, column=0, sticky=W, pady=4)
e2 = Entry(master)
e2.grid(row=6, column=1, sticky=E)

Label(master, text="Measurement from farthest from 0+00").grid(row=7, column=0, sticky=W, pady=4)
e3 = Entry(master)
e3.grid(row=7, column=1, sticky=E, pady=4)

Label(master, text="Offset from station line").grid(row=8, column=0, sticky=W, pady=4)
height_label = Label(master, text="")
height_label.grid(row=8, column=1)

Label(master, text="Feet from Measurement nearest to 0+00").grid(row=9, column=0, sticky=W, pady=4)
side_label = Label(master, text="")
side_label.grid(row=9, column=1)

Button(master, text='Calculate', command=show_entry_fields).grid(row=10, column=0, pady=4)

mainloop()

标签: pythonpython-3.xtkinter

解决方案


有几种方法可以做到这一点,但由于执行的数学很简单,我建议使用它root.after来计算你的结果。基本上它会尝试每 0.1 秒计算一次,并在没有发现错误时显示结果。

from tkinter import *
from math import *

def show_entry_fields():
    try:
        a, b, c = float(e1.get()), float(e2.get()), float(e3.get())
        s = (a + b + c) / 2
        height = (sqrt(s * (s - a) * (s - b) * (s - c)) * 2) / b
        height = float(format(height, '.3f'))
        height_label['text'] = str(height)
        side = (sqrt((a ** 2) - (height ** 2)))
        side = float(format(side, '.3f'))
        side_label['text'] = str(side)
    except ValueError: #catch empty field or invalid input error
        pass
    master.after(100, show_entry_fields)

...

master.after(100,show_entry_fields) # add this
master.mainloop()

推荐阅读