Как проверить наличие пустого поля ввода в Tkinter и присвоить ему значение 0? - PullRequest
0 голосов
/ 30 октября 2019

У меня есть 3 ярлыка и поля ввода, один - «Сэндвич», другой - напитки, а третий - их расчетная стоимость.

Там я ожидаю, что пользователь введет количество бутербродов и напитков, которые ониПолучите и рассчитайте их цену и покажите ее в третьем окне, используя следующую формулу:

totalCost = (cod*30)+(cos*100)
costtotal.set(totalCost)

И это прекрасно.

Однако проблема в том, что, например,пользователь ничего не вводит в поле напитков, я хочу, чтобы интерпретатор интерпретировал это пустое поле как 0 и вычислял сумму. Но моя программа не рассчитывает его, если какое-либо из двух полей (Напитки и Бутерброды) пусто. Итак, чтобы противостоять этому, я попытался:

if not drinks.get():
   yourVar = "0"
   cod=float(yourVar)

Это сообщение об ошибке, которое я получаю:

Файл "C: / Users / Dell E6430 / Desktop / try.py", строка 18, в Ref cod = float (drinks.get ()) ValueError: не удалось преобразовать строку в 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())

, программа теперь работает нормально.

1 Ответ

1 голос
/ 30 октября 2019

Вы не можете запустить float() для чего-либо, что не является допустимым числом. Вероятно, вам следует сначала проверить, возвращает ли ваш get() число с isnumeric(), а затем, если true, выполнить float, если не установить значение в ноль. Это будет обрабатывать все, кроме цифр, и даже если это буква.

Примечание. Я немного очистил ваш код, чтобы более точно следовать стандартам 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()

Результаты:

enter image description here

Чтобы ответить на ваш вопрос в комментариях, вы можете использовать список или список пар для управления большим количеством полей. Примите во внимание следующее и дайте мне знать, если у вас есть какие-либо вопросы.

Код:

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()

Результаты:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...