python - 如何检查 Tkinter 中的空输入框并将值 0 分配给它?
问题描述
我有 3 个标签和输入框,一个是三明治,另一个是饮料,第三个用于显示他们的计算成本。
在那里,我希望用户输入他们吃过的三明治和饮料的数量并计算价格,并使用以下公式将其显示在第三个框中:
totalCost = (cod*30)+(cos*100)
costtotal.set(totalCost)
它做得非常完美。
但是,问题是,例如用户没有在饮料字段中输入任何内容,我希望解释器将该空字段解释为 0 并计算总和。但是,如果两个字段(饮料和三明治)中的任何一个为空,我的程序就不会计算它。所以,为了解决这个问题,我尝试了:
if not drinks.get():
yourVar = "0"
cod=float(yourVar)
这是我收到的错误消息:
文件“C:/Users/Dell E6430/Desktop/trying.py”,第 18 行,在 Ref cod=float(drinks.get()) ValueError: could not convert string to float:
当我输入这两个字段时,我没有收到此错误消息。
但是,它不起作用,结果是一样的。那么,我该如何解决呢?谢谢。
这是完整的代码:
from tkinter import*
root=Tk()
root.geometry("1600x800+0+0")
#------- convert to string
drinks=StringVar()
costtotal=StringVar()
sandwich=StringVar()
#----Frame
f1=Frame(root,width=800, height=700,relief=SUNKEN)
f1.pack(side=LEFT)
def Ref():
cos=float(sandwich.get())
cod=float(drinks.get())
if not drinks.get():
yourVar = "0"
cod=float(yourVar)
totalCost = (cod*30)+(cos*100)
costtotal.set(totalCost)
lblSandwich=Label(f1,font=('arial',16,'bold'),text="Sandwich" , bd=16, anchor='w')
lblSandwich.grid(row=0,column=0)
txtSandwich=Entry(f1,font=('arial',16,'bold'),textvariable=sandwich,bd=10,insertwidth=4,bg="powder blue",justify='right')
txtSandwich.grid(row=0,column=1)
lblDrinks=Label(f1,font=('arial',16,'bold'),text="Drinks" , bd=16, anchor='w')
lblDrinks.grid(row=1,column=0)
txtDrinks=Entry(f1,font=('arial',16,'bold'),textvariable=drinks,bd=10,insertwidth=4,bg="powder blue",justify='right')
txtDrinks.grid(row=1,column=1)
lblcostTotal=Label(f1,font=('arial',16,'bold'),text="Cost of Drinks" , bd=16, anchor='w')
lblcostTotal.grid(row=2,column=0)
txtcostTotal=Entry(f1,font=('arial',16,'bold'),textvariable=costtotal,bd=10,insertwidth=4,bg="powder blue",justify='right')
txtcostTotal.grid(row=2,column=1)
btnTotal=Button(f1,padx=16,pady=8,bd=16,fg="black",font=('arial',16,'bold'),width=10,text="Total", bg="Powder Blue"\
,command=Ref).grid(row=7,column=1)
root.mainloop()
编辑:通过做
cod=drinks.get()
if not drinks.get():
yourVar = "0"
cod=float(yourVar)
else:
cod=float(drinks.get())
该程序现在运行良好。
解决方案
你不能float()
越过任何不是有效数字的东西。您可能应该首先检查您get()
是否返回一个数字,isnumeric()
如果没有将值设置为零,则运行浮点数。这将处理任何不是数字的东西,即使它是一个字母。
注意我已经清理了您的代码以更紧密地遵循 PEP8 标准,并更新了您的导入以帮助防止覆盖。import tkinter as tk
总是优先于*
.
试试这个:
import tkinter as tk
root = tk.Tk()
root.geometry("1600x800+0+0")
cost_total = tk.StringVar()
sandwich = tk.StringVar()
drinks = tk.StringVar()
f1 = tk.Frame(root, width=800, height=700, relief='sunken')
f1.pack(side='left')
def ref():
d = drinks.get()
s = sandwich.get()
if d.isnumeric():
cod = float(d)
else:
cod = 0
if s.isnumeric():
cos = float(s)
else:
cos = 0
total_cost = (cod * 30) + (cos * 100)
cost_total.set(total_cost)
tk.Label(f1, font=('arial', 16, 'bold'), text="Sandwich", bd=16, anchor='w').grid(row=0, column=0)
tk.Entry(f1, font=('arial', 16, 'bold'), textvariable=sandwich, bd=10, insertwidth=4,
bg="powder blue", justify='right').grid(row=0, column=1)
tk.Label(f1, font=('arial', 16, 'bold'), text="Drinks", bd=16, anchor='w').grid(row=1, column=0)
tk.Entry(f1, font=('arial', 16, 'bold'), textvariable=drinks, bd=10, insertwidth=4,
bg="powder blue", justify='right').grid(row=1, column=1)
tk.Label(f1, font=('arial', 16, 'bold'), text="Cost of Drinks", bd=16, anchor='w').grid(row=2, column=0)
tk.Entry(f1, font=('arial', 16, 'bold'), textvariable=cost_total, bd=10, insertwidth=4,
bg="powder blue", justify='right').grid(row=2, column=1)
tk.Button(f1, padx=16, pady=8, bd=16, fg="black", font=('arial', 16, 'bold'), width=10,
text="Total", bg="Powder Blue", command=ref).grid(row=7, column=1)
root.mainloop()
结果:
要在评论中回答您的问题,您可以使用列表或一对列表来管理大量字段。请考虑以下内容,如果您有任何问题,请告诉我。
代码:
import tkinter as tk
list_of_foods = [['Coffie', 30], ['Tea', 20], ['Sandwich', 100], ['Apple', 50]]
def ref():
total = 0
for ndex, entry in enumerate(entry_list):
value = entry.get()
if value.isnumeric():
total += float(value) * list_of_foods[ndex][1]
print(total)
else:
total += 0
double_var.set(total)
root = tk.Tk()
double_var = tk.DoubleVar(root, value=0)
entry_list = []
for ndex, sub_list in enumerate(list_of_foods):
tk.Label(root, text=sub_list[0]).grid(row=ndex, column=0)
entry_list.append(tk.Entry(root))
entry_list[-1].grid(row=ndex, column=1)
tk.Entry(root, textvariable=double_var).grid(row=len(entry_list)+2, column=0, columnspan=2)
tk.Button(root, text='Total', command=ref).grid(row=len(entry_list)+3, column=0, columnspan=2)
root.mainloop()
结果:
推荐阅读
- swift - 将秒转换为分钟:MacOS 标签中的秒
- c# - C# - 通过反射从抽象类中的类变量调用函数
- javascript - 在for循环javascript之前或之中计算.length
- swift - 转到其他视图时 AVPlayer 音乐停止
- javascript - Javascript中的隐式转换
- c# - 如何使用 JsonConvert 从包含空数组的 JSON 字符串中获取 DataTable?
- java - Java JNDI API 用户无法通过多林设置向 AD 进行身份验证
- sql-server - 用于从 Alteryx 调用 SQL Server 存储过程的 ODBC 与 OLEDB
- android - 尝试在 AOSP 中运行 ButterKnife,返回 NullPointerException
- c# - 服务器标记格式不正确 - ID 中的 Eval 错误