【问题标题】:How to avoid division by zero error when calculating average value from entry in tkinter从 tkinter 中的条目计算平均值时如何避免除以零错误
【发布时间】:2020-12-19 21:49:39
【问题描述】:
root = Tk()


def calc_avg():
    
    s = entry.get()
    digit_list = [float(x) for x in s]
    avg = sum(digit_list) / len(digit_list)
    b = f'{avg:.3f}'


    if avg >= 1.450:
        avg_value = Label(side_frame, text=employee + ":  " + str(b), font=('Helvetica 10 bold'), fg="green")
        avg_value.place(relx='0.03', rely='0.05')
    elif avg <= 1.449 and avg >= 1.400:
        lpd_value = Label(side_frame, text=employee + ":  " + str(b), font=('Helvetica 10 bold'), fg="orange")
        avg_value.place(relx='0.03', rely='0.05')
    else:
        avg_value = Label(side_frame, text=employee + ":  " + str(b), font=('Helvetica 10 bold'), fg="red")
        avg_value.place(relx='0.03', rely='0.05')

    avg_value.after(1000, calc_avg)

employee = "John"

main_frame = LabelFrame(root, width=650, height=500)
side_frame = LabelFrame(root, width=200, height=500)

main_frame.grid(row=0, column=0)
side_frame.grid(row=0, column=1)

label1 = Label(main_frame, text=employee, font=('Helvetica 12 bold'))
label1.place(relx='0.03', rely='0.05')

entry = Entry(main_frame, width=42, borderwidth=1, font=('Helvetica 12'))
entry.place(relx='0.22', rely='0.05')

calc_avg()

root.mainloop()

我遇到了一个问题,当我在输入框中输入一串数字时,程序应该计算这些数字的平均浮点值。

我已经实现了 '''after()''' 方法,所以值是实时更新的。

问题是,当我启动我的程序时,由于一开始的输入框中没有数字,我马上得到 ZeroDivisionError。

当没有输入而不是错误消息时,如何使标签显示“无值”;以及有数值输入时的实际值?

【问题讨论】:

  • 一个简单的if 可能吗?
  • 不看你的代码很难判断
  • 我们需要查看minimal reproducible example 以提供具体帮助,但作为猜测只需添加一个if data: 块。
  • 当变量有特定值时,如何避免运行程序的一部分? ...当变量具有特定值时,它与运行程序的一部分相同

标签: python tkinter


【解决方案1】:

首先,您不需要末尾的str(b),因为b 已经是一个字符串。您可以只使用一个简单的 if 语句来检查长度是否非零:

def calc_avg():
    s = entry.get()
    digit_list = [float(x) for x in s]
    # check to make sure it has elements
    if digit_list:
        avg = sum(digit_list) / len(digit_list)
        b = f'{avg:.3f}'
    else:
        avg = None
        b = "No value"

    if avg is None:
        avg_value = Label(side_frame, text=employee + ":  " + b, font=('Helvetica 10 bold'), fg="red")
        avg_value.place(relx='0.03', rely='0.05')
    elif avg >= 1.450:
        avg_value = Label(side_frame, text=employee + ":  " + b, font=('Helvetica 10 bold'), fg="green")
        avg_value.place(relx='0.03', rely='0.05')
    elif avg <= 1.449 and avg >= 1.400:
        lpd_value = Label(side_frame, text=employee + ":  " + b, font=('Helvetica 10 bold'), fg="orange")
        avg_value.place(relx='0.03', rely='0.05')
    else:
        avg_value = Label(side_frame, text=employee + ":  " + b, font=('Helvetica 10 bold'), fg="red")
        avg_value.place(relx='0.03', rely='0.05')

    avg_value.after(1000, calc_avg)

【讨论】:

  • 如果digit_list 的长度为零,则avg 在第一个 if/else 块之后未定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2014-12-02
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
相关资源
最近更新 更多