Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 范围错误-(名称错误:未定义名称和日期)_Python 3.x_Tkinter - Fatal编程技术网

Python 3.x 范围错误-(名称错误:未定义名称和日期)

Python 3.x 范围错误-(名称错误:未定义名称和日期),python-3.x,tkinter,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 __cal

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

我得到以下错误:

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

你知道我为什么会犯这种错误,或者我遗漏了一些没有正确声明的错误吗。感谢您的反馈。

问题描述:

您在方法
到期
中声明了日期

这样,日期范围就是方法
到期

您尝试在方法
结果
中访问日期,在此方法中您没有声明日期(从
到期
方法开始的日期不在
结果
方法的范围内)

解决方案:

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

怎么做

\uuuu init\uuuu
方法中声明日期:

self.data = None
expiry
方法中,如下使用:

self.date = self.userinput1.get()
在方法
结果中

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

我建议您阅读

中有关python作用域的内容。您需要在
结果
函数中使用self.date:

def result(self):
    result = datetime.date(self.date - days)
    return result
但是,这仍然会引发错误,因为:

a)
self.date
已初始化为无,并且从未更改为数字

b)
days
没有定义(我在代码的其他地方看不到对它的引用)


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

谢谢@omri\u saadon。我遵循了你的反馈,这是有道理的。我的代码运行时没有错误,但一旦按下按钮,输出标签中就不会显示任何内容。你知道为什么吗?@AbrahamValencia,那是因为你需要在
result
方法中返回结果。在
result
方法中添加另一行:
returnresult
result继续不显示任何内容。我已经在上面的代码中包含了您的反馈。