0

当我尝试一个数字时,它给了我invalid,但我只想说它invalid是负数还是不是数字:

from Tkinter import *
import tkMessageBox

class MyApp(object):
def __init__(self):
    self.root = Tk()
    self.root.wm_title("Question 7")
    self.label = Label(self.root, text="Enter weight in pounds",
                       font=('Calibri', 50))
    self.label.pack(padx=20,pady=10)
    self.labeltext = StringVar()
    self.labeltext.set("")
    Label(self.root, textvariable=self.labeltext).pack()
    self.entrytext = StringVar()
    Entry(self.root, textvariable=self.entrytext).pack()
    self.entrytext.trace('w', self.entry_changed)

    self.root.mainloop()



def entry_changed(self, a, b, c):
    s = self.entrytext.get()
    try:
        a=int(s)*4.3
        self.labeltext.set(a)
    except:
        if s=="":
           self.labeltext.set("")
    else:
        self.labeltext.set("invalid")


MyApp()
4

1 回答 1

2

编辑:正如@BillTheLizard 指出的那样,您更有可能忘记else正确缩进您的陈述。else:因此,基本上忽略下面的所有内容,并在and前面添加四个空格self.labeltext.set("invalid"):)

您的问题在于try/except. 当您用作块的else一部分时,如果子句没有引发异常,则该块将执行。因此,在您的情况下,只要块成功完成并执行,它就会转到子句并覆盖相同的文本。try/exceptelsetrytryself.labeltext.set(a)else

为了完成我认为您正在尝试完成的事情,请尝试以下操作:

def entry_changed(self, a, b, c):
    s = self.entrytext.get()

    try:
        a = int(s)
        if a > 0:
            a *= 4.3 # -> a = a * 4.3
            self.labeltext.set(a)
    except ValueError: # Always specify what kind of exception you are catching
        if s == "":
            self.labeltext.set("")
        else:
            self.labeltext.set("invalid")

我删除了,else因为听起来你想要任何不是数字或 < 0 的东西来 return invalid。您以前except处理空字符串的方式不同,因此可以根据需要进行调整。

于 2012-10-29T03:13:34.717 回答