为什么我无法使用 try-except 将 str 转换为 int?
Why am I unable to use try-except to convert str to int?
我做了这两组不同的代码,它们在 tkinter 上具有相同的功能。 simplediaglog 版本工作得很好,但我想使用条目(因为我想在同一个弹出窗口 window 上显示输出),这是行不通的。
问题主要在于将字典中的浮点值列表乘以条目输入值并得到python甚至将条目输入识别为int。
我尝试重组 try-except-else,尝试使用不同的方式使用 IntVar() 将条目输入转换为整数。我还尝试索引字典,即 x[y][0]。我尝试将浮点值放入字符串中,例如x = {"A":“2.3”,"B":“0.3”}。但是没有任何效果,不断出现不同的错误,但都归结为一件事:无法将 integer/str 与字典中的浮点值相乘。
def p(y):
while True:
Q = simpledialog.askstring("test", "Enter number:")
try:
Q = int(Q)
if Q is None:
break
elif Q <=0 or Q> 10:
raise ValueError
else:
W = str(round(Q * x[y], 1)) # Round off to 1 d.p
messagebox.showinfo("test", "Ans is\n" + W + " minute(s)")
break
except:
messagebox.showerror("Error", "enter a value from 0 to 10")
break
此代码有效并正确显示了所有内容。
顺便说一句,对于下面的代码,几何图形是我随机放置的,以查看整体代码是否有效,我认为错误不是由几何图形引起的。
上面的简单对话代码有效。
但是,此入口小部件代码不会:
def p(y):
root = Tk()
root.title("Average Waiting Time")
root.geometry("800x500")
Label(root, text="Enter number of people: ").place(x=20, y=30)
Q = Entry(root, bd =5)
Q.place(x=220, y=30)
def B():
Q_input = Q.get()
while True:
try:
int(Q_input)
if Q_input is None:
continue
elif Q_input <=0 or Q_input > 10:
raise ValueError
else:
W = str(round(Q_input * x[y], 1)) # Round off to 1 d.p
Label(root, "Ans\n" + W + " minute(s)").place(x=50, y=500)
except:
messagebox.showerror("Error", "enter a value from 0 to 10")
break
ok = Button (root, text="OK", command = B)
ok.place(x=300, y=300)
cancel = Button (root, text="Cancel", command = root.destroy)
cancel.place(x=400,y=300)
root.mainloop()
这是我的浮点值列表字典:
x = {"A": 0.8, "B": 2.5, "C": 1.2}
我希望在与输入小部件相同的 window 中看到类似 Ans 2.3 分钟的标签。
但是即使我在条目输入中键入一个整数,例如“5”,try-except 也不会将其转换为整数,因为我不断收到 "Error" 消息:"enter a value from 0 to 10" .
为什么会这样?是因为它是一个入口小部件而不是 simpledialog 因为它适用于 simplediaglog 吗?
此外,即使我到达 W 行(设法将 Q_input)转换为整数,它也显示错误:'str' 对象没有属性 'items'。
我的主要问题是为什么浮点字典列表(以及从 str 到 int 的类型转换)能够在 simpledialog 上注册,但不能在条目小部件上注册?有什么不同?是否可以将字典中的浮点值与条目输入中的整数相乘?
此外,除了条目小部件之外,还有其他方法可以在同一弹出窗口 window 上显示输出吗?
提前致谢!
编辑:
因此,我尝试在 while 循环之前将 Q_input 转换为 int 并打印它。
如果我输入“5”,它会打印“5”。我知道它确实转换为 int,因为当我输入 'hi' 时,出现错误:以 10 为底的 int() 的无效文字:'hi'.
我也把int(Q_input)
改成了Q_input=int(Q_input)
。根据建议,我还在 if Q_input is None:
.
下将 continue
更改为 break
但是,try-except 仍然不起作用,它甚至没有尝试将 Q_input 转换为 int,它只是直接跳到 except
.
不好意思问了这么多问题,我就总结成一个问题吧:
我的 try-except
代码是否因为 simpledialog 和输入小部件之间的差异而无法正常工作,如果是这样,原因是什么?如果不是,那么为什么代码无法正常工作?
解法:
我意识到一些事情,因为这个我一直无法显示标签:Label(root, "Ans\n" + W + " minute(s)").place(x=50, y=500)
。我没有放text=
,哈哈我加了text=
就可以显示标签成功了。我的错,所以一直以来的问题都不是将条目输入转换为整数。不过需要将 int(Q_input)
更改为 Q_input=int(Q_input)
。我只是跳到错误是因为类型转换的结论,因为程序一直直接进入 except
.
你实际上并没有保存整数转换:
try:
Q_input = int(Q_input)
还有
except Exception as e:
print(e)
所以你知道如果触发异常是怎么回事
看来是这个问题。
try:
int(Q_input)
if Q_input is None:
continue
您需要将 int(Q_input) 赋给一个变量,就像您在工作代码中所做的那样。见下文。
try:
Q = int(Q)
if Q is None:
break
我经常使用函数将字符串安全地转换为 int 或 float,例如to_int
下面。
下面的代码创建了一个根据需要使用的答案标签。原始代码为每次单击按钮创建一个标签。
from tkinter import *
def to_int(string, fail = 0):
try:
return int(string)
except ValueError:
return fail
x = {"A": 0.8, "B": 2.5, "C": 1.2}
def p(y):
root = Tk()
root.title("Average Waiting Time")
root.geometry("800x500")
Label(root, text="Enter number of people: ").place(x=20, y=30)
Q = Entry(root, bd =5)
Q.place(x=220, y=30)
answer = StringVar()
answer.set("")
Label(root, textvariable = answer ).place(x=50, y=500)
def B():
Q_input = Q.get()
v = to_int(Q_input, -1)
# Returning <0 triggers the error message
if v <=0 or v > 10:
answer.set("Enter a value from 0 to 10")
else:
W = str(round(v * x[y], 1)) # Round off to 1 d.p
answer.set("Ans\n" + W + " minute(s)")
print(answer.get())
ok = Button (root, text="OK", command = B)
ok.place(x=300, y=300)
cancel = Button (root, text="Cancel", command = root.destroy)
cancel.place(x=400,y=300)
root.mainloop()
我做了这两组不同的代码,它们在 tkinter 上具有相同的功能。 simplediaglog 版本工作得很好,但我想使用条目(因为我想在同一个弹出窗口 window 上显示输出),这是行不通的。
问题主要在于将字典中的浮点值列表乘以条目输入值并得到python甚至将条目输入识别为int。
我尝试重组 try-except-else,尝试使用不同的方式使用 IntVar() 将条目输入转换为整数。我还尝试索引字典,即 x[y][0]。我尝试将浮点值放入字符串中,例如x = {"A":“2.3”,"B":“0.3”}。但是没有任何效果,不断出现不同的错误,但都归结为一件事:无法将 integer/str 与字典中的浮点值相乘。
def p(y):
while True:
Q = simpledialog.askstring("test", "Enter number:")
try:
Q = int(Q)
if Q is None:
break
elif Q <=0 or Q> 10:
raise ValueError
else:
W = str(round(Q * x[y], 1)) # Round off to 1 d.p
messagebox.showinfo("test", "Ans is\n" + W + " minute(s)")
break
except:
messagebox.showerror("Error", "enter a value from 0 to 10")
break
此代码有效并正确显示了所有内容。
顺便说一句,对于下面的代码,几何图形是我随机放置的,以查看整体代码是否有效,我认为错误不是由几何图形引起的。
上面的简单对话代码有效。
但是,此入口小部件代码不会:
def p(y):
root = Tk()
root.title("Average Waiting Time")
root.geometry("800x500")
Label(root, text="Enter number of people: ").place(x=20, y=30)
Q = Entry(root, bd =5)
Q.place(x=220, y=30)
def B():
Q_input = Q.get()
while True:
try:
int(Q_input)
if Q_input is None:
continue
elif Q_input <=0 or Q_input > 10:
raise ValueError
else:
W = str(round(Q_input * x[y], 1)) # Round off to 1 d.p
Label(root, "Ans\n" + W + " minute(s)").place(x=50, y=500)
except:
messagebox.showerror("Error", "enter a value from 0 to 10")
break
ok = Button (root, text="OK", command = B)
ok.place(x=300, y=300)
cancel = Button (root, text="Cancel", command = root.destroy)
cancel.place(x=400,y=300)
root.mainloop()
这是我的浮点值列表字典:
x = {"A": 0.8, "B": 2.5, "C": 1.2}
我希望在与输入小部件相同的 window 中看到类似 Ans 2.3 分钟的标签。
但是即使我在条目输入中键入一个整数,例如“5”,try-except 也不会将其转换为整数,因为我不断收到 "Error" 消息:"enter a value from 0 to 10" .
为什么会这样?是因为它是一个入口小部件而不是 simpledialog 因为它适用于 simplediaglog 吗?
此外,即使我到达 W 行(设法将 Q_input)转换为整数,它也显示错误:'str' 对象没有属性 'items'。
我的主要问题是为什么浮点字典列表(以及从 str 到 int 的类型转换)能够在 simpledialog 上注册,但不能在条目小部件上注册?有什么不同?是否可以将字典中的浮点值与条目输入中的整数相乘?
此外,除了条目小部件之外,还有其他方法可以在同一弹出窗口 window 上显示输出吗?
提前致谢!
编辑: 因此,我尝试在 while 循环之前将 Q_input 转换为 int 并打印它。 如果我输入“5”,它会打印“5”。我知道它确实转换为 int,因为当我输入 'hi' 时,出现错误:以 10 为底的 int() 的无效文字:'hi'.
我也把int(Q_input)
改成了Q_input=int(Q_input)
。根据建议,我还在 if Q_input is None:
.
continue
更改为 break
但是,try-except 仍然不起作用,它甚至没有尝试将 Q_input 转换为 int,它只是直接跳到 except
.
不好意思问了这么多问题,我就总结成一个问题吧:
我的 try-except
代码是否因为 simpledialog 和输入小部件之间的差异而无法正常工作,如果是这样,原因是什么?如果不是,那么为什么代码无法正常工作?
解法:
我意识到一些事情,因为这个我一直无法显示标签:Label(root, "Ans\n" + W + " minute(s)").place(x=50, y=500)
。我没有放text=
,哈哈我加了text=
就可以显示标签成功了。我的错,所以一直以来的问题都不是将条目输入转换为整数。不过需要将 int(Q_input)
更改为 Q_input=int(Q_input)
。我只是跳到错误是因为类型转换的结论,因为程序一直直接进入 except
.
你实际上并没有保存整数转换:
try:
Q_input = int(Q_input)
还有
except Exception as e:
print(e)
所以你知道如果触发异常是怎么回事
看来是这个问题。
try:
int(Q_input)
if Q_input is None:
continue
您需要将 int(Q_input) 赋给一个变量,就像您在工作代码中所做的那样。见下文。
try:
Q = int(Q)
if Q is None:
break
我经常使用函数将字符串安全地转换为 int 或 float,例如to_int
下面。
下面的代码创建了一个根据需要使用的答案标签。原始代码为每次单击按钮创建一个标签。
from tkinter import *
def to_int(string, fail = 0):
try:
return int(string)
except ValueError:
return fail
x = {"A": 0.8, "B": 2.5, "C": 1.2}
def p(y):
root = Tk()
root.title("Average Waiting Time")
root.geometry("800x500")
Label(root, text="Enter number of people: ").place(x=20, y=30)
Q = Entry(root, bd =5)
Q.place(x=220, y=30)
answer = StringVar()
answer.set("")
Label(root, textvariable = answer ).place(x=50, y=500)
def B():
Q_input = Q.get()
v = to_int(Q_input, -1)
# Returning <0 triggers the error message
if v <=0 or v > 10:
answer.set("Enter a value from 0 to 10")
else:
W = str(round(v * x[y], 1)) # Round off to 1 d.p
answer.set("Ans\n" + W + " minute(s)")
print(answer.get())
ok = Button (root, text="OK", command = B)
ok.place(x=300, y=300)
cancel = Button (root, text="Cancel", command = root.destroy)
cancel.place(x=400,y=300)
root.mainloop()