Tkinter'if'语句返回错误的文本

时间:2012-10-29 01:08:24

标签: python tkinter

当我尝试一个号码时,它会给我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()

1 个答案:

答案 0 :(得分:2)

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

您的问题与try/except的使用有关。当您使用else作为try/except块的一部分时,如果else子句未引发异常,则try部分将执行。因此,在您的情况下,只要try块成功完成并执行self.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返回invalid。您之前的except处理空字符串的方式不同,因此可以根据需要对其进行调整。