2017-07-02 10 views
0

更新しない日付の通知を計算する小さなウィジェットを作成しようとしています。基本的には、有効期限から非更新日の通知を差し引き、ボタンをクリックして出力を生成します。スコープエラー - (NameError:name 'date'が定義されていません)

私は次のエラーを取得する:次のように

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\Abraham Valencia\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1699, in __call__ 
    return self.func(*args) 
    File "C:\Users\Abraham Valencia\Desktop\Python Learning Folder\test1.py", line 50, in result 
    result = datetime.date(date - days) 
NameError: name 'date' is not defined 

私のコードは次のとおりです。

import tkinter as tk 
from datetime import datetime, timedelta 

class Application(tk.Frame): 

    def __init__(self, master): 
     tk.Frame.__init__(self, master) 
     self.master = master 
     master.title("Trade Finance") 
     master.minsize(width=250, height=200) 
     master.maxsize(width=250, height=200) 
     self.date = None 


     #Input of expiry date 
     label = tk.LabelFrame(master, text = "Input", bd = 2, font='none 8 italic') 
     label.pack() 
     tk.Label(label, text="Expiry Date (YYYY-MM-DD)",font = 'none 10').pack() 

     self.userinput1 = tk.StringVar() 
     tk.Entry(label,textvariable = self.userinput1).pack() 

     #Input of non-renewal days 
     tk.Label(label, text="Non-Renewal Days",font = 'none 10').pack() 

     self.userinput2 = tk.StringVar() 
     tk.Entry(label, textvariable = self.userinput2).pack() 

     #output results 
     label_1 = tk.LabelFrame(master, text = "Output", bd = 2, font='none 8 italic') 
     label_1.pack() 
     tk.Label(label_1,text= 'Review Date',font= 'none 10').pack() 
     button = tk.Button(label_1, text="Calculate", fg ='white', bg = 'black',font= 'none 10 bold',command=self.result).pack() 
     tk.Entry(label_1, textvariable = self.result).pack() 


    def expiry(self): 
     while True: 
      date = self.userinput1.get() 
      try: 
       return datetime.strptime(date, '%Y-%m-%d') 
      except ValueError: 
       print('Please follow the date format') 


    def notice_days(self): 
     ndays = self.userinput2.get() 
     return timedelta(days=ndays) 

    def result(self): 
     result = datetime.date(date - days) 
     return result 

if __name__=='__main__': 
    root = tk.Tk() 
    app = Application(root) 
    app.mainloop() 

私はこのタイプのエラーが生じています、またはI私はその何かが欠けている理由上の任意のアイデア適切に宣言されていません。フィードバックいただきありがとうございます。問題の

答えて

0

説明:

あなたは方法expiryに日付を宣言しました。

これにより、日付範囲はexpiryとなります。

resultの日付にアクセスしようとしましたが、このメソッドでは日付が宣言されていません(expiryのメソッドの日付はresultメソッド以外の範囲です)。

策:これを修正するために

は、あなたが日付変数クラスのデータ・メンバーにすることができます。

どうすればよいですか? __init__方法で

は日に宣言します。方法result

self.date = self.userinput1.get() 

expiry方法で

self.data = None 

はこのようにそれを使用

if self.date: 
    result = datetime.date(self.date - days) 

私は読むことをおをお勧めしますPythonのスコープについてはhere

+0

ありがとうございました@omri_saadon。私は理にかなってあなたのフィードバックに従ってきました。コードはエラーなしで実行されますが、ボタンを押すと出力ラベルに何も表示されません。なぜなのかご存知ですか? –

+0

@AbrahamValencia、それは 'result'メソッドで結果を返す必要があるからです。 'result'メソッドに別の行を追加します:' return result' –

+0

結果は何も表示されません。私はあなたのフィードバックを上記のコードに含めました。 –

0

あなたはresult機能でself.dateを使用する必要があります。

A)self.dateなしに初期化に変更されることはありません:

def result(self): 
    result = datetime.date(self.date - days) 
    return result 

しかし、これはまだエラーがスローされます番号

b)daysは定義されていません(コードの他の部分は参照していません)。

このコードの予想される動作は何ですか?

関連する問題