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继续不显示任何内容。我已经在上面的代码中包含了您的反馈。