【发布时间】:2021-09-21 16:09:00
【问题描述】:
我正在尝试制作一个程序,每次用户按下按钮时,都会在日期变量中添加一个月。
这是我的代码:
import datetime
from dateutil.relativedelta import relativedelta
from tkinter import *
gameDate = datetime.datetime(1985, 9, 1)
def nextMonth(gameDate, worldDateLabel):
gameDate = gameDate + relativedelta(months=1)
worldDateLabel.config(text=gameDate.strftime("%B %Y"))
return gameDate
window = Tk()
worldDateLabel = Label(window, text=gameDate.strftime("%B %Y"))
worldDateLabel.grid(row=0, column=0)
next_btn = Button(window, text="Next Month", command=lambda:nextMonth(gameDate, worldDateLabel))
next_btn.grid(row=1, column=0)
window.mainloop()
日期在我第一次点击按钮时更新,但之后会停留到 10 月,不会移动到下个月。
我认为这是因为程序只更新了函数内部的局部变量,而不是主要的gameDate 一个。我试图通过最后的 return 来解决这个问题,但这并没有帮助。
我不确定我做错了什么……
P.S.:我尽量不使用global。
【问题讨论】:
-
这是声明gameDate的本地副本的参数,它正在更新而不是全局。您可以包装 gameDate (例如,在一个类、一个元组、单个项目列表中)并将其传递给您的 nextMonth 函数。当你在函数中更新它时,实际的变量将会改变。
-
没错,如果你想让gameDate作为一个全局变量,你需要将它声明为一个全局变量。您可以将该类创建为一个类并调用一个可以修改该对象的方法,然后调用任何可能需要的标签更新函数来使其工作。
标签: python python-3.x tkinter