为什么我无法使用 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()