ошибка программы tkinter, от которой я не могу избавиться - PullRequest
0 голосов
/ 28 января 2020

Я получаю сообщение об ошибке, используя tkinter, и не могу понять, что я делаю неправильно, чтобы вызвать эту ошибку.

Вот мой код:

from tkinter import *

windows = Tk()
frame = Frame(windows,height = 200 ,width  = 700)
heading = Label(frame,text="COST CALCULATOR").grid(row = 0,column = 1,columnspan =7)
frame.pack()

def area(length,breadth):
    global area
    ftom(length,breadth)
    area = length*breadth
    return area

t1 = Label(frame,text = "enter the length:").grid(row = 1 ,column = 0)
e1 = Entry(frame)
e1.grid(row =1,column = 1)
ln = e1.get()
e1.delete(0,END)

t2 = Label(frame,text = "enter the breadth:").grid(row = 2 ,column = 0)
e2 = Entry(frame)
e2.grid(row = 2,column = 1)
br = e2.get()
e2.delete(0,END)

t3 = Label(frame,text = "total area covered").grid(row = 3 ,column = 0)
ln = int(ln)
br = int(br)
ar = area(ln,br)
e3 = Label(frame,text =f"{ar}")
e3.grid(row = 3 , column = 1)
windows.mainloop()

И это ошибка, которую я получаю:

Traceback (most recent call last):
  File "C:/Users/Allen Alex Abraham/allensworld/allensworld/trial2.py", line 55, in <module>
    ln = int(ln)
ValueError: **invalid literal for int() with base 10: ''**

Ответы [ 2 ]

1 голос
/ 28 января 2020

Проблема в том, что вы вызываете e1.get() примерно за миллисекунду после создания виджета ввода, задолго до того, как у пользователя появится возможность ввода данных.

GUI программирование не похоже на GUI программирование - виджеты не блокируются, пока пользователь не введет что-то, как input. Вместо этого вам нужно определить кнопку или какой-то другой способ для пользователя выполнить вычисления, когда они будут готовы (пункт меню, связывание клавиатуры и т. Д. c).

Самое простое решение - создать кнопку для выполнения расчетов. Когда вы нажимаете кнопку, функция, связанная с кнопкой, может собирать необходимые данные, вызывать функцию для вычисления результата, а затем обновлять отображение результатов.

Например, начните с определения функции который получит данные и вычислит результат:

def do_calculation():
    length = int(e1.get())
    breadth = int(e2.get())
    result = area(length, breadth)
    e3.configure(text=result)

Затем создайте кнопку, которая будет вызывать эту функцию при нажатии:

do_calc_button = Button(frame, command=do_calculation, text="Calculate")
do_calc_button.grid(row=4, column=0)

С этим пользователь может вводить значения, нажмите кнопку и увидите результат.

0 голосов
/ 28 января 2020

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

Тем не менее, я сказал, что я бы изменил несколько вещей здесь.

  1. вместо импорта выполните import tkinter as tk при импорте *, поскольку это поможет предотвратить перезапись методов в будущем.

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

  3. get() всегда возвращает строку, поэтому ваша математика не будет работать, пока вы не конвертируете свои значения в целые числа или числа с плавающей точкой. поэтому что-то вроде int(e1.get()) будет работать здесь. Тем не менее, для предотвращения ошибок при отправке чего-либо, отличного от числа, вы можете использовать оператор try/except для обработки ошибок.

  4. не называть функции и переменные одним и тем же. Это может вызвать проблемы, поэтому всегда используйте уникальные имена для ваших переменных / функций / класса и т. Д.

Посмотрите на приведенный ниже код и дайте мне знать, если у вас есть какие-либо вопросы:

import tkinter as tk


windows = tk.Tk()
frame = tk.Frame(windows, height=200, width=700)
tk.Label(frame, text="COST CALCULATOR").grid(row=0, column=1, columnspan=7)
frame.pack()

tk.Label(frame, text="enter the length:").grid(row=1, column=0)
tk.Label(frame, text="enter the breadth:").grid(row=2, column=0)
tk.Label(frame, text="total area covered").grid(row=3, column=0)
e1 = tk.Entry(frame)
e2 = tk.Entry(frame)
e3 = tk.Label(frame, text=f"")
e1.grid(row=1, column=1)
e2.grid(row=2, column=1)
e3.grid(row=3, column=1)


def area_func():
    ln = e1.get()
    br = e2.get()
    e1.delete(0, "end")
    e2.delete(0, "end")
    try:
        area = int(ln) * int(br)
        e3.config(text=f"{area}")
    except BaseException as e:
        print("Value error. Make sure you have only entered a valid integer.")
        print(e)


tk.Button(frame, text="Submit", command=area_func).grid(row=4, column=0, columnspan=2)
windows.mainloop()
...