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
,然后在最后使用它结果
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异常有更多有用的错误消息,但它们的工作效率相当低。