范围错误 - (NameError:未定义名称'日期')

时间:2017-07-02 14:31:08

标签: python-3.x tkinter

我正在尝试创建一个小部件,用于计算非续订日期的通知。基本上,从到期日减去非续约天数的通知,并通过点击按钮生成输出。

我收到以下错误:

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

我知道为什么会遇到这种类型的错误,或者我错过了一些未正确声明的内容。感谢您的反馈。

2 个答案:

答案 0 :(得分:0)

问题描述:

您在方法https://graph.facebook.com/v2.9/t_mid.$cAASnBD_EQdhjNJRBZVdA0750e5Q_/messages?fields=id,message,from,to&access_token=<page_access_token> 中声明了日期。

由此,日期范围是方法expiry

您尝试访问方法expiry中的日期,在此方法中您尚未声明日期(result方法的日期在expiry方法之外的其他范围内)。

<强>解决方案:

为了解决这个问题,您可以将日期变量设为类的数据成员。

怎么做?

result方法中声明日期:

__init__

self.data = None 方法中使用它:

expiry

方法self.date = self.userinput1.get()

result

我建议你阅读here

中有关python范围的内容

答案 1 :(得分:0)

您需要在with tf.Graph().as_default(): 函数中使用self.date:

result

然而,这仍然会引发错误,因为:

a)def result(self): result = datetime.date(self.date - days) return result 初始化为无,并且从未更改为数字

b)self.date未定义(我在代码的其他地方看不到它的引用)。

此代码的预期行为是什么?