2012-10-29 26 views
0

當我嘗試了一些它給了我invalid但我只希望它說invalid如果它是一個負數或不是一個數字:Tkinter的「如果」語句,返回不正確的文本

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() 

回答

2

編輯:作爲@比爾TheLizard指出,更有可能是你忘記正確縮進你的else陳述。因此,基本上忽略下面的所有內容,並在else:self.labeltext.set("invalid")前加上四個空格:)

您的問題與try/except的用法一致。當您使用else作爲try/except塊的一部分時,如果try子句不引發異常,則else塊將執行。因此,在您的情況下,只要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以不同的方式處理空字符串,因此可以根據需要進行調整。

+0

這看起來像一個縮進問題(不是唯一的問題)。我認爲'else:'應該與'if s ==「」:'具有相同的縮進級別。 –

+0

@BilltheLizard哈,好了,現在我覺得很傻:)好的電話。 – RocketDonkey

+0

嗯,我什至不能得到代碼運行,所以我不知道。 :) –