对入口框中的变量求和时筛选"无"



我一直在尝试执行一个简单的输入框值求和,但在求和时忽略它或使它=0,无法有效地处理None。我正在尝试的最新选项是过滤器。然而,我被告知这也可以通过字典或Walrus运算符对每个变量进行处理。我没有让他们中的任何一个工作。

这是我的代码:

 def sum(self):
        self.atotalcost_entry.delete(0, 'end')
        a = int(float(self.cost102_entry.get()))
        b = int(float(self.cost103_entry.get()))
        c = int(float(self.cost112_entry.get()))
        d = int(float(self.cost130_entry.get()))
        e = int(float(self.cost149_entry.get()))
        f=  int(float(sum(filter(None,(a,b,c,d,e)))))
        self.atotalcost_entry.insert(0,format_money(Money(f,USD),locale='en_US'))

以下是我尝试过的过滤器:

f=  int(float(sum(filter(None,(a,b,c,d,e)))))

我得到错误无法将字符串转换为浮点:无:

我也尝试过短路:

a = int(float(self.cost102_entry.get() or 0))

相同错误

首先将小部件放在列表中。请注意,如果您在第一次创建小部件时将其放在列表中,则可以避免此步骤。

entries = (
    self.cost102_entry,
    self.cost103_entry,
    self.cost112_entry,
    self.cost130_entry,
    self.cost149_entry,
)

接下来,使用列表理解来获取所有非空窗口小部件的值,并将每个值转换为浮点值:

values = [float(entry.get()) for entry in entries if entry.get()]

注意:这不是唯一的方法——如果你愿意,你确实可以使用过滤器,尽管它可能有点复杂。此外,此步骤假定所有值都能够转换为浮点值。

如果您对列表理解不熟悉或不舒服,那么一个普通的循环可以只使用几行额外的代码。这也使添加错误检查变得容易,如果你愿意的话。为了使示例简单且功能与列表理解相同,我在下面的示例中省略了这一点。

values = []
for entry in entries:
    s = entry.get()
    if s:
        values.append(float(s))

现在,使用sum来计算总和:

print(f"sum:", {sum(values)}")

最新更新