Python TypeError:必须是实数,而不是条目

Python TypeError:必须是实数,而不是条目,python,tkinter,Python,Tkinter,我正在创建一个代码来创建计算器,但我不断遇到以下错误: 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 Sh

我正在创建一个代码来创建计算器,但我不断遇到以下错误:

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)

尝试将用户输入转换为
float
int
。看起来您正试图对用户输入(条目对象)应用数学运算,但条目对象不支持数学运算。

尝试将用户输入转换为浮动或int。看起来您正试图对用户输入应用数学运算(输入<代码>项对象),但输入<代码>项对象不支持数学运算。

此代码存在许多问题:

  • 您需要存储那些
    get
    调用的结果
  • ,您需要将它们转换为
    float
    int
  • 您应该在启动时创建一次结果
    Label
    ,并
    config
    此回调中的文本,而不是每次用户点击
    Submit
    时创建一个新的
    Label
  • 不要重复相同的代码6次,只需在
    elif
    链中计算
    结果
    ,然后在最后使用它
我在回答你之前的问题时已经解释了其中的大部分

结果应该如下所示:

结果标签=标签(窗口,文本=str(n\u textentry**m\u textentry),bg=“白色”) 结果\u label.grid(行=13,列=0,粘性=N)

正如我前面提到的,如果用户将其中一个条目留空,或输入文本而不是数字,或被零除等,您可能需要一些错误处理。最简单的方法是使用
try:
围绕整个
单击
函数:

def click():
    try:
        n = int(n_textentry.get())
        # etc.
    except Exception as e:
        result_label.config(text=repr(e))

此代码存在许多问题:

  • 您需要存储那些
    get
    调用的结果
  • ,您需要将它们转换为
    float
    int
  • 您应该在启动时创建一次结果
    Label
    ,并
    config
    此回调中的文本,而不是每次用户点击
    Submit
    时创建一个新的
    Label
  • 不要重复相同的代码6次,只需在
    elif
    链中计算
    结果
    ,然后在最后使用它
我在回答你之前的问题时已经解释了其中的大部分

结果应该如下所示:

结果标签=标签(窗口,文本=str(n\u textentry**m\u textentry),bg=“白色”) 结果\u label.grid(行=13,列=0,粘性=N)

正如我前面提到的,如果用户将其中一个条目留空,或输入文本而不是数字,或被零除等,您可能需要一些错误处理。最简单的方法是使用
try:
围绕整个
单击
函数:

def click():
    try:
        n = int(n_textentry.get())
        # etc.
    except Exception as e:
        result_label.config(text=repr(e))

我如何将其更改为
float
int
,因为您使用的是
textentry
,所以它不会保留为
条目
?使用
int()
float()
函数是我的第一个猜测。但是,tkinter可能有一种方法将
Entry
对象转换为数字类型。如果
int()
float()
不起作用,您需要查看tkinter的文档。我如何将其更改为
float
int
,因为您使用的是
textentry
,所以它不会保留为
条目
?使用
int()
float()
函数是我的第一个猜测。但是,tkinter可能有一种方法将
Entry
对象转换为数字类型。如果
int()
float()
不起作用,您需要查看tkinter的文档。好的,但我不太明白except的实际作用。@monishhah您不知道
try
/
except
?很好地解释了这一点,但看看这里的用户输入的不同问题会产生什么样的文本。那么
except
是一种查找错误的调试工具吗?@MonishShah在Python中,异常既用于调试代码中的错误,也用于处理用户错误。例如,如果用户为第一个数字键入
spam
而不是
12
,您将得到类似
ValueError:无法将字符串转换为float:“spam”
。这不是您可以修复的代码中的bug;这是一个用户错误,您必须通过告诉用户来处理。理想情况下,与原始Python异常相比,您的程序应该有更多有用的错误消息,但它们的工作效率相当低。好的,但我并不真正理解except案例的实际作用。@monishha您不知道
try
/
except
?很好地解释了这一点,但看看这里的用户输入的不同问题会产生什么样的文本。那么
except
是一种查找错误的调试工具吗?@MonishShah在Python中,异常既用于调试代码中的错误,也用于处理用户错误。例如,如果用户为第一个数字键入
spam
而不是
12
,您将得到类似
ValueError:无法将字符串转换为float:“spam”
。这不是您可以修复的代码中的bug;这是一个用户错误,您必须通过告诉用户来处理。理想情况下,您的程序应该比原始Python异常有更多有用的错误消息,但它们的工作效率相当低。