我想做一個程式,在用戶每次按下一個按鈕時,為一個日期變數增加一個月。
下面是我的代碼:
import datetime
from dateutil.relativedelta import relativedelta
from tkinter import *
gameDate = datetime.datetime(1985, 9, 1)
def nextMonth(gameDate, worldDateLabel)。
gameDate = gameDate relativedelta(month=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的變數。我試著用最后的回傳來解決這個問題,但這并沒有幫助。
我不確定我做錯了什么...
。P.S.: 我試圖不使用global。
uj5u.com熱心網友回復:
在這種情況下你需要global。避免使用global的一般規則有很多例外。全域變數的問題是,它傾向于以一種不明顯的方式將不同的函式結合在一起,而這些函式可能最好是相互獨立的。想想看,編程更容易,錯誤更少。
腳本越簡單,這個問題就越少。在你的案例中,你有一個只有一個主事件回圈的程式,有幾個額外的全域變數是可以的。但是隨著你的代碼的增長,你發現對nextMonth函式的不同使用,這時它就會成為一個問題了。
解決這個問題的一個方法是使用一個類。一個類的實體方法會記住它的實體,所以你可以定義一個類來做有用的游戲日期東西。類的實體本身仍然是全域的,但Tk視窗也是如此。但是你現在已經封裝了這個功能,如果你想的話,可以在其他地方使用這個類。
import datetime
from dateutil.relativedelta import relativedelta
from tkinter import *
class GameDate:
def __init__(self):
self.gameDate = datetime.datetime(1985, 9, 1)
def nextMonth(self, worldDateLabel)。
self.gameDate = self.gameDate relativedelta(month=1)
worldDateLabel.config(text=self.gameDate.strftime("%B%Y")
window = Tk()
date = GameDate()
worldDateLabel = Label(window, text=gameDate.strftime("%B%Y")
worldDateLabel.grid(row=0, column=0)
next_btn = Button(window, text="Next Month", command=lambda: date.nextMonth(worldDateLabel)
next_btn.grid(row=1, column=0)
window.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/330572.html
標籤:
