我一直在尝试执行一个简单的输入框值求和,但在求和时忽略它或使它=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)}")