TypeError: должно быть действительным числом, а не Entry - PullRequest
0 голосов
/ 02 июля 2018

Я создаю код для создания калькулятора, но постоянно получаю эту ошибку:

Traceback (most recent call last):
     File "C:\Users\Monish Shah\AppData\Local\Programs\Python\Python36- 
  32\lib\tkinter\__init__.py", line 1702, in __call__
       return self.func(*args)
     File "C:\Users\Monish Shah\AppData\Local\Programs\Python\Python36- 
 32\monish-play\calc-completed-copy-for-editing-copy2.py", line 40, in click
Label (window, text = str(sqrt(n_textentry)), bg = "white") .grid(row = 13, 
  column = 0, sticky = N)
    TypeError: must be real number, not Entry

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

Вот мой код, который я использовал:

from math import sqrt
from tkinter import *

window = Tk()
window.title("Welcome to Calculator ")
window.configure(background = "white")
Label (window, text = "Calculator", bg = "white") .grid(row = 0, column = 0, 
sticky = N)


#to create the box for the first number and store it
Label (window, text = "Enter the first number", bg = "white") .grid(row = 1, 
column = 0, sticky = N)
n_textentry = Entry(window, width = 10, bg = "white")
n_textentry.grid(row = 2, column = 0, sticky = N)

#to create the box for the second number
Label (window, text = "Enter the second number", bg = "white") .grid(row = 5, 
column = 0, sticky = N)
m_textentry = Entry(window, width = 10, bg = "white")
m_textentry.grid(row = 6, column = 0, sticky = N)


#click function
def click():
    n_textentry.get()

    m_textentry.get()

    operation_textentry.get()

    if operation_textentry == 1:
        result1 = Label (window, text = str(n_textentry + m_textentry), bg = 
"white") .grid(row = 13, column = 0, sticky = N)
    elif operation_textentry == 2:
         Label (window, text = str(n_textentry - m_textentry), bg = "white") 
.grid(row = 13, column = 0, sticky = N)
    elif operation_textentry == 3:
         Label (window, text = str(n_textentry * m_textentry), bg = "white") 
.grid(row = 13, column = 0, sticky = N)
    elif operation_textentry == 4:
         Label (window, text = str(n_textentry / m_textentry), bg = "white") 
.grid(row = 13, column = 0, sticky = N)
    elif operation_textentry == 5:
         Label (window, text = str(n_textentry ** m_textentry), bg = "white") 
.grid(row = 13, column = 0, sticky = N)
    else:
         Label (window, text = str(sqrt(n_textentry)), bg = "white") 
.grid(row = 13, column = 0, sticky = N)


   # operation_textentry == 6:
     #   Label (window, text = str(sqrt(n_textentry)), bg = "white") 
.grid(row = 13, column = 0, sticky = N)
    #else:
     #   print("Invalid Operation ")




#to show list of options
Label (window, text = '''
Enter 1 for addition
Enter 2 for subtraction
Enter 3 for multiplication
Enter 4 for division
Enter 5 for exponentiation
Enter 6 for square root *This will only work for 1st choice*''', bg = 
"white") .grid(row = 9, column = 0, sticky = W)

operation_textentry = Entry(window, width = 10, bg = "white")
operation_textentry.grid(row = 10, column = 0, sticky = N)
Button(window, text = "Submit", width = 6, command=click) .grid(row = 11, 
column = 0, sticky = N)

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Существует ряд проблем с этим кодом:

  • Вам необходимо сохранить результаты этих get вызовов.
  • Как подсказал Джоэл , вам необходимо преобразовать их в float или int.
  • Вы должны создать результаты Label один раз при запуске и config текст в этом обратном вызове, вместо создания нового Label каждый раз, когда пользователь нажимает Submit.
  • Вместо того, чтобы повторять один и тот же код 6 раз, просто вычислите result в цепочке elif, а затем используйте его в конце.

Я уже объяснил большую часть этого в своем ответе на ваш предыдущий вопрос.

Результат должен выглядеть примерно так:

result_label = Label (окно, текст = str (n_textentry ** m_textentry), bg = "white") result_label.grid (row = 13, column = 0, sticky = N)

def click():
    n = int(n_textentry.get())
    m = int(m_textentry.get())
    operation = int(operation_textentry.get())

    if operation == 1:
        result = n+m
    elif operation == 2:
        result = n-m
    elif operation == 3:
        result = n*m
    elif operation == 4:
        result = n/m
    elif operation == 5:
        result = n**m
    else:
        result = "Invalid Operation"
    result_label.config(text=str(result))

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

def click():
    try:
        n = int(n_textentry.get())
        # etc.
    except Exception as e:
        result_label.config(text=repr(e))
0 голосов
/ 02 июля 2018

Попробуйте преобразовать пользовательский ввод в float или int. Похоже, вы пытаетесь применить математическую операцию к пользовательскому вводу (объект Entry), но математические операции не поддерживаются для Entry объектов.

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